diff --git a/docker/Dockerfile b/docker/Dockerfile index 71a078b..4026237 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,10 +29,10 @@ RUN chmod 555 /app/api RUN apk add --no-cache bash ca-certificates # Install Deco -ARG DECO_VERSION=1.0.2 +ARG DECO_VERSION=1.3.0 ARG DECO_OS=linux ARG DECO_ARCH=amd64 -ADD https://github.com/YaleUniversity/deco/releases/download/v${DECO_VERSION}/deco-v${DECO_VERSION}-${DECO_OS}-${DECO_ARCH}.tar.gz /usr/local/bin/deco.tar.gz +ADD https://github.com/YaleUniversity/deco/releases/download/v${DECO_VERSION}/deco_${DECO_VERSION}_${DECO_OS}_${DECO_ARCH}.tar.gz /usr/local/bin/deco.tar.gz RUN cd /usr/local/bin && tar -zxvf deco.tar.gz && rm -f deco.tar.gz && chmod 555 deco && /usr/local/bin/deco version COPY docker/*_config.sh /app diff --git a/ec2/instances.go b/ec2/instances.go index 45c80b9..4f9db42 100644 --- a/ec2/instances.go +++ b/ec2/instances.go @@ -67,6 +67,9 @@ func (e *Ec2) GetInstance(ctx context.Context, id string) (*ec2.Instance, error) out, err := e.Service.DescribeInstancesWithContext(ctx, &ec2.DescribeInstancesInput{ InstanceIds: aws.StringSlice([]string{id}), + Filters: []*ec2.Filter{ + notTerminated(), + }, }) if err != nil { @@ -75,8 +78,12 @@ func (e *Ec2) GetInstance(ctx context.Context, id string) (*ec2.Instance, error) log.Debugf("got output for instance %s: %+v", id, out) + if len(out.Reservations) == 0 || len(out.Reservations[0].Instances) == 0 { + return nil, apierror.New(apierror.ErrNotFound, "Resource not found", nil) + } + if len(out.Reservations) != 1 || len(out.Reservations[0].Instances) != 1 { - return nil, apierror.New(apierror.ErrBadRequest, "unexpected count", nil) + return nil, apierror.New(apierror.ErrBadRequest, "Unexpected resource count", nil) } return out.Reservations[0].Instances[0], nil diff --git a/ec2/instances_test.go b/ec2/instances_test.go new file mode 100644 index 0000000..0974618 --- /dev/null +++ b/ec2/instances_test.go @@ -0,0 +1,81 @@ +package ec2 + +import ( + "context" + "reflect" + "testing" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/aws/aws-sdk-go/service/ec2/ec2iface" +) + +func (m *mockEC2Client) DescribeInstancesWithContext(ctx context.Context, input *ec2.DescribeInstancesInput, opts ...request.Option) (*ec2.DescribeInstancesOutput, error) { + if m.err != nil { + return nil, m.err + } + + if len(input.InstanceIds) != 0 && aws.StringValue(input.InstanceIds[0]) == "i-notfound" { + return &ec2.DescribeInstancesOutput{}, nil + } else if len(input.InstanceIds) != 0 && aws.StringValue(input.InstanceIds[0]) == "i-multiple" { + return &ec2.DescribeInstancesOutput{ + Reservations: []*ec2.Reservation{}, + }, nil + } + + return nil, nil +} + +func TestEc2_GetInstance(t *testing.T) { + type fields struct { + session *session.Session + Service ec2iface.EC2API + DefaultKMSKeyId string + DefaultSgs []string + DefaultSubnets []string + org string + } + type args struct { + ctx context.Context + id string + } + tests := []struct { + name string + fields fields + args args + want *ec2.Instance + wantErr bool + }{ + { + name: "empty id", + fields: fields{Service: newmockEC2Client(t, nil)}, + args: args{ + ctx: context.TODO(), + id: "", + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + e := &Ec2{ + session: tt.fields.session, + Service: tt.fields.Service, + DefaultKMSKeyId: tt.fields.DefaultKMSKeyId, + DefaultSgs: tt.fields.DefaultSgs, + DefaultSubnets: tt.fields.DefaultSubnets, + org: tt.fields.org, + } + got, err := e.GetInstance(tt.args.ctx, tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("Ec2.GetInstance() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Ec2.GetInstance() = %v, want %v", got, tt.want) + } + }) + } +}