Skip to content
This repository has been archived by the owner on Nov 1, 2022. It is now read-only.

Commit

Permalink
Polyfill container fields filter from v10 to v6
Browse files Browse the repository at this point in the history
  • Loading branch information
aaron7 committed Jun 12, 2018
1 parent f0eef01 commit 64be046
Show file tree
Hide file tree
Showing 12 changed files with 355 additions and 160 deletions.
17 changes: 0 additions & 17 deletions api/v6/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (

"github.com/weaveworks/flux"
"github.com/weaveworks/flux/git"
"github.com/weaveworks/flux/image"
"github.com/weaveworks/flux/job"
"github.com/weaveworks/flux/ssh"
"github.com/weaveworks/flux/update"
Expand Down Expand Up @@ -42,22 +41,6 @@ type ControllerStatus struct {
Policies map[string]string
}

type Container struct {
Name string `json:",omitempty"`
Current image.Info `json:",omitempty"`
LatestFiltered image.Info `json:",omitempty"`

// All available images (ignoring tag filters)
Available []image.Info `json:",omitempty"`
AvailableError string `json:",omitempty"`
AvailableImagesCount int `json:",omitempty"`
NewAvailableImagesCount int `json:",omitempty"`

// Filtered available images (matching tag filters)
FilteredImagesCount int `json:",omitempty"`
NewFilteredImagesCount int `json:",omitempty"`
}

// --- config types

type GitRemoteConfig struct {
Expand Down
115 changes: 115 additions & 0 deletions api/v6/container.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package v6

import (
"github.com/pkg/errors"
"github.com/weaveworks/flux/image"
"github.com/weaveworks/flux/registry"
"github.com/weaveworks/flux/update"
)

// Container describes an individual container including current image info and
// available images.
type Container struct {
Name string `json:",omitempty"`
Current image.Info `json:",omitempty"`
LatestFiltered image.Info `json:",omitempty"`

// All available images (ignoring tag filters)
Available []image.Info `json:",omitempty"`
AvailableError string `json:",omitempty"`
AvailableImagesCount int `json:",omitempty"`
NewAvailableImagesCount int `json:",omitempty"`

// Filtered available images (matching tag filters)
FilteredImagesCount int `json:",omitempty"`
NewFilteredImagesCount int `json:",omitempty"`
}

// NewContainer creates a Container given a list of images and the current image
func NewContainer(name string, images update.ImageInfos, currentImage image.Info, tagPattern string, fields []string) (Container, error) {
// All images
imagesCount := len(images)
imagesErr := ""
if images == nil {
imagesErr = registry.ErrNoImageData.Error()
}
var newImages []image.Info
for _, img := range images {
if img.CreatedAt.After(currentImage.CreatedAt) {
newImages = append(newImages, img)
}
}
newImagesCount := len(newImages)

// Filtered images
filteredImages := images.Filter(tagPattern)
filteredImagesCount := len(filteredImages)
var newFilteredImages []image.Info
for _, img := range filteredImages {
if img.CreatedAt.After(currentImage.CreatedAt) {
newFilteredImages = append(newFilteredImages, img)
}
}
newFilteredImagesCount := len(newFilteredImages)
latestFiltered, _ := filteredImages.Latest()

container := Container{
Name: name,
Current: currentImage,
LatestFiltered: latestFiltered,

Available: images,
AvailableError: imagesErr,
AvailableImagesCount: imagesCount,
NewAvailableImagesCount: newImagesCount,
FilteredImagesCount: filteredImagesCount,
NewFilteredImagesCount: newFilteredImagesCount,
}
return filterContainerFields(container, fields)
}

// filterContainerFields returns a new container with only the fields specified. If not fields are specified,
// a list of default fields is used.
func filterContainerFields(container Container, fields []string) (Container, error) {
// Default fields
if len(fields) == 0 {
fields = []string{
"Name",
"Current",
"LatestFiltered",
"Available",
"AvailableError",
"AvailableImagesCount",
"NewAvailableImagesCount",
"FilteredImagesCount",
"NewFilteredImagesCount",
}
}

var c Container
for _, field := range fields {
switch field {
case "Name":
c.Name = container.Name
case "Current":
c.Current = container.Current
case "LatestFiltered":
c.LatestFiltered = container.LatestFiltered
case "Available":
c.Available = container.Available
case "AvailableError":
c.AvailableError = container.AvailableError
case "AvailableImagesCount":
c.AvailableImagesCount = container.AvailableImagesCount
case "NewAvailableImagesCount":
c.NewAvailableImagesCount = container.NewAvailableImagesCount
case "FilteredImagesCount":
c.FilteredImagesCount = container.FilteredImagesCount
case "NewFilteredImagesCount":
c.NewFilteredImagesCount = container.NewFilteredImagesCount
default:
return c, errors.Errorf("%s is an invalid field", field)
}
}
return c, nil
}
130 changes: 130 additions & 0 deletions api/v6/container_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package v6

import (
"reflect"
"testing"

"github.com/weaveworks/flux/image"
"github.com/weaveworks/flux/update"
)

func TestNewContainer(t *testing.T) {

testImage := image.Info{ImageID: "test"}

type args struct {
name string
images update.ImageInfos
currentImage image.Info
tagPattern string
fields []string
}
tests := []struct {
name string
args args
want Container
wantErr bool
}{
{
name: "Simple",
args: args{
name: "container1",
images: update.ImageInfos{testImage},
currentImage: testImage,
tagPattern: "*",
},
want: Container{
Name: "container1",
Current: testImage,
LatestFiltered: testImage,
Available: []image.Info{testImage},
AvailableImagesCount: 1,
NewAvailableImagesCount: 0,
FilteredImagesCount: 1,
NewFilteredImagesCount: 0,
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := NewContainer(tt.args.name, tt.args.images, tt.args.currentImage, tt.args.tagPattern, tt.args.fields)
if (err != nil) != tt.wantErr {
t.Errorf("NewContainer() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewContainer() = %v, want %v", got, tt.want)
}
})
}
}

func TestFilterContainerFields(t *testing.T) {
testContainer := Container{
Name: "test",
Current: image.Info{ImageID: "123"},
LatestFiltered: image.Info{ImageID: "123"},
Available: []image.Info{{ImageID: "123"}},
AvailableError: "test",
AvailableImagesCount: 1,
NewAvailableImagesCount: 2,
FilteredImagesCount: 3,
NewFilteredImagesCount: 4,
}

type args struct {
container Container
fields []string
}
tests := []struct {
name string
args args
want Container
wantErr bool
}{
{
name: "Default fields",
args: args{
container: testContainer,
},
want: testContainer,
wantErr: false,
},
{
name: "Filter",
args: args{
container: testContainer,
fields: []string{"Name", "Available", "NewAvailableImagesCount", "NewFilteredImagesCount"},
},
want: Container{
Name: "test",
Available: []image.Info{{ImageID: "123"}},
NewAvailableImagesCount: 2,
NewFilteredImagesCount: 4,
},
wantErr: false,
},
{
name: "Invalid field",
args: args{
container: testContainer,
fields: []string{"Invalid"},
},
want: Container{},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := filterContainerFields(tt.args.container, tt.args.fields)
if (err != nil) != tt.wantErr {
t.Errorf("FilterContainerFields() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("FilterContainerFields() = %v, want %v", got, tt.want)
}
})
}
}
69 changes: 4 additions & 65 deletions daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -572,77 +572,16 @@ func containers2containers(cs []resource.Container) []v6.Container {
}

func getServiceContainers(service cluster.Controller, imageRepos update.ImageRepos, policyResourceMap policy.ResourceMap, fields []string) (res []v6.Container, err error) {
if len(fields) == 0 {
fields = []string{
"Name",
"Current",
"LatestFiltered",
"Available",
"AvailableError",
"AvailableImagesCount",
"NewAvailableImagesCount",
"FilteredImagesCount",
"NewFilteredImagesCount",
}
}

for _, c := range service.ContainersOrNil() {
var container v6.Container

imageRepo := c.Image.Name
tagPattern := getTagPattern(policyResourceMap, service.ID, c.Name)
tagPattern := policy.GetTagPattern(policyResourceMap, service.ID, c.Name)

images := imageRepos.GetRepoImages(imageRepo)
currentImage := images.FindWithRef(c.Image)

// All images
imagesCount := len(images)
imagesErr := ""
if images == nil {
imagesErr = registry.ErrNoImageData.Error()
}
var newImages []image.Info
for _, img := range images {
if img.CreatedAt.After(currentImage.CreatedAt) {
newImages = append(newImages, img)
}
}
newImagesCount := len(newImages)

// Filtered images
filteredImages := images.Filter(tagPattern)
filteredImagesCount := len(filteredImages)
var newFilteredImages []image.Info
for _, img := range filteredImages {
if img.CreatedAt.After(currentImage.CreatedAt) {
newFilteredImages = append(newFilteredImages, img)
}
}
newFilteredImagesCount := len(newFilteredImages)

for _, field := range fields {
switch field {
case "Name":
container.Name = c.Name
case "Current":
container.Current = currentImage
case "LatestFiltered":
container.LatestFiltered, _ = filteredImages.Latest()
case "Available":
container.Available = images
case "AvailableError":
container.AvailableError = imagesErr
case "AvailableImagesCount":
container.AvailableImagesCount = imagesCount
case "NewAvailableImagesCount":
container.NewAvailableImagesCount = newImagesCount
case "FilteredImagesCount":
container.FilteredImagesCount = filteredImagesCount
case "NewFilteredImagesCount":
container.NewFilteredImagesCount = newFilteredImagesCount
default:
return nil, errors.Errorf("%s is an invalid field", field)
}
container, err := v6.NewContainer(c.Name, images, currentImage, tagPattern, fields)
if err != nil {
return res, err
}
res = append(res, container)
}
Expand Down
1 change: 0 additions & 1 deletion daemon/daemon_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (

"github.com/go-kit/kit/log"
"github.com/stretchr/testify/assert"

"github.com/weaveworks/flux"
"github.com/weaveworks/flux/api/v10"
"github.com/weaveworks/flux/api/v6"
Expand Down
Loading

0 comments on commit 64be046

Please sign in to comment.