From ee24ca1acc3f6d7162bed4da9971e805e90e3b2a Mon Sep 17 00:00:00 2001 From: Justin Santa Barbara Date: Sun, 11 Dec 2016 00:10:57 -0500 Subject: [PATCH] Add mock ec2 images API --- cloudmock/aws/mockec2/api.go | 2 + cloudmock/aws/mockec2/images.go | 103 +++++++++++++++++++++++++ cloudmock/aws/mockec2/unimplemented.go | 24 ------ 3 files changed, 105 insertions(+), 24 deletions(-) create mode 100644 cloudmock/aws/mockec2/images.go diff --git a/cloudmock/aws/mockec2/api.go b/cloudmock/aws/mockec2/api.go index da4f4f5dda..14a90ebd16 100644 --- a/cloudmock/aws/mockec2/api.go +++ b/cloudmock/aws/mockec2/api.go @@ -27,6 +27,8 @@ type MockEC2 struct { RouteTables []*ec2.RouteTable + Images []*ec2.Image + subnetNumber int Subnets []*ec2.Subnet diff --git a/cloudmock/aws/mockec2/images.go b/cloudmock/aws/mockec2/images.go new file mode 100644 index 0000000000..b99d2f42cf --- /dev/null +++ b/cloudmock/aws/mockec2/images.go @@ -0,0 +1,103 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mockec2 + +import ( + "fmt" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/golang/glog" + "strings" +) + +func (m *MockEC2) DescribeImageAttributeRequest(*ec2.DescribeImageAttributeInput) (*request.Request, *ec2.DescribeImageAttributeOutput) { + panic("Not implemented") + return nil, nil +} +func (m *MockEC2) DescribeImageAttribute(*ec2.DescribeImageAttributeInput) (*ec2.DescribeImageAttributeOutput, error) { + panic("Not implemented") + return nil, nil +} +func (m *MockEC2) DescribeImagesRequest(*ec2.DescribeImagesInput) (*request.Request, *ec2.DescribeImagesOutput) { + panic("Not implemented") + return nil, nil +} + +func (m *MockEC2) DescribeImages(request *ec2.DescribeImagesInput) (*ec2.DescribeImagesOutput, error) { + glog.Infof("DescribeImages: %v", request) + + var images []*ec2.Image + + for _, image := range m.Images { + matches, err := m.imageMatchesFilter(image, request.Filters) + if err != nil { + return nil, err + } + if !matches { + continue + } + + copy := *image + copy.Tags = m.getTags(ec2.ResourceTypeImage, *image.ImageId) + images = append(images, ©) + } + + response := &ec2.DescribeImagesOutput{ + Images: images, + } + + return response, nil +} +func (m *MockEC2) DescribeImportImageTasksRequest(*ec2.DescribeImportImageTasksInput) (*request.Request, *ec2.DescribeImportImageTasksOutput) { + panic("Not implemented") + return nil, nil +} +func (m *MockEC2) DescribeImportImageTasks(*ec2.DescribeImportImageTasksInput) (*ec2.DescribeImportImageTasksOutput, error) { + panic("Not implemented") + return nil, nil +} + +func (m *MockEC2) imageMatchesFilter(image *ec2.Image, filters []*ec2.Filter) (bool, error) { + allFiltersMatch := true + for _, filter := range filters { + match := false + switch *filter.Name { + + case "name": + for _, v := range filter.Values { + if aws.StringValue(image.Name) == *v { + match = true + } + } + + default: + if strings.HasPrefix(*filter.Name, "tag:") { + match = m.hasTag(ec2.ResourceTypeImage, *image.ImageId, filter) + } else { + return false, fmt.Errorf("unknown filter name: %q", *filter.Name) + } + } + + if !match { + allFiltersMatch = false + break + } + } + + return allFiltersMatch, nil +} diff --git a/cloudmock/aws/mockec2/unimplemented.go b/cloudmock/aws/mockec2/unimplemented.go index 68d0cbc054..d62534e47d 100644 --- a/cloudmock/aws/mockec2/unimplemented.go +++ b/cloudmock/aws/mockec2/unimplemented.go @@ -690,30 +690,6 @@ func (m *MockEC2) DescribeIdentityIdFormat(*ec2.DescribeIdentityIdFormatInput) ( panic("Not implemented") return nil, nil } -func (m *MockEC2) DescribeImageAttributeRequest(*ec2.DescribeImageAttributeInput) (*request.Request, *ec2.DescribeImageAttributeOutput) { - panic("Not implemented") - return nil, nil -} -func (m *MockEC2) DescribeImageAttribute(*ec2.DescribeImageAttributeInput) (*ec2.DescribeImageAttributeOutput, error) { - panic("Not implemented") - return nil, nil -} -func (m *MockEC2) DescribeImagesRequest(*ec2.DescribeImagesInput) (*request.Request, *ec2.DescribeImagesOutput) { - panic("Not implemented") - return nil, nil -} -func (m *MockEC2) DescribeImages(*ec2.DescribeImagesInput) (*ec2.DescribeImagesOutput, error) { - panic("Not implemented") - return nil, nil -} -func (m *MockEC2) DescribeImportImageTasksRequest(*ec2.DescribeImportImageTasksInput) (*request.Request, *ec2.DescribeImportImageTasksOutput) { - panic("Not implemented") - return nil, nil -} -func (m *MockEC2) DescribeImportImageTasks(*ec2.DescribeImportImageTasksInput) (*ec2.DescribeImportImageTasksOutput, error) { - panic("Not implemented") - return nil, nil -} func (m *MockEC2) DescribeImportSnapshotTasksRequest(*ec2.DescribeImportSnapshotTasksInput) (*request.Request, *ec2.DescribeImportSnapshotTasksOutput) { panic("Not implemented") return nil, nil