Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit 09c51fe

Browse files
committed
move image verification logic into preppers. replace string->prep map with array
1 parent 5549483 commit 09c51fe

File tree

11 files changed

+86
-90
lines changed

11 files changed

+86
-90
lines changed

cmd/analyze.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var analyzeCmd = &cobra.Command{
3333
Short: "Analyzes an image: [image]",
3434
Long: `Analyzes an image using the specifed analyzers as indicated via flags (see documentation for available ones).`,
3535
Args: func(cmd *cobra.Command, args []string) error {
36-
if err := validateArgs(args, checkAnalyzeArgNum, checkArgType); err != nil {
36+
if err := validateArgs(args, checkAnalyzeArgNum); err != nil {
3737
return errors.New(err.Error())
3838
}
3939
if err := checkIfValidAnalyzer(types); err != nil {

cmd/diff.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ var diffCmd = &cobra.Command{
3434
Short: "Compare two images: [image1] [image2]",
3535
Long: `Compares two images using the specifed analyzers as indicated via flags (see documentation for available ones).`,
3636
Args: func(cmd *cobra.Command, args []string) error {
37-
if err := validateArgs(args, checkDiffArgNum, checkArgType); err != nil {
37+
if err := validateArgs(args, checkDiffArgNum); err != nil {
3838
return errors.New(err.Error())
3939
}
4040
if err := checkIfValidAnalyzer(types); err != nil {

cmd/root.go

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"strings"
2525

2626
"github.com/GoogleCloudPlatform/container-diff/differs"
27-
pkgutil "github.com/GoogleCloudPlatform/container-diff/pkg/util"
2827
"github.com/GoogleCloudPlatform/container-diff/util"
2928
"github.com/docker/docker/client"
3029
"github.com/golang/glog"
@@ -92,24 +91,6 @@ func validateArgs(args []string, validatefxns ...validatefxn) error {
9291
return nil
9392
}
9493

95-
func checkImage(arg string) bool {
96-
if !pkgutil.CheckImageID(arg) && !pkgutil.CheckImageURL(arg) && !pkgutil.CheckTar(arg) {
97-
return false
98-
}
99-
return true
100-
}
101-
102-
func checkArgType(args []string) error {
103-
for _, arg := range args {
104-
if !checkImage(arg) {
105-
errMessage := fmt.Sprintf("Argument %s is not an image ID, URL, or tar\n", args[0])
106-
glog.Errorf(errMessage)
107-
return errors.New(errMessage)
108-
}
109-
}
110-
return nil
111-
}
112-
11394
func checkIfValidAnalyzer(flagtypes string) error {
11495
if flagtypes == "" {
11596
return nil

cmd/root_test.go

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,7 @@ limitations under the License.
1616

1717
package cmd
1818

19-
import (
20-
"testing"
21-
)
22-
2319
type testpair struct {
2420
input []string
2521
expected_output bool
2622
}
27-
28-
var argTypeTests = []testpair{
29-
{[]string{"badID", "badID"}, false},
30-
{[]string{"123456789012", "badID"}, false},
31-
{[]string{"123456789012", "123456789012"}, true},
32-
{[]string{"?!badDiffer71", "123456789012"}, false},
33-
{[]string{"123456789012", "gcr.io/repo/image"}, true},
34-
}
35-
36-
func TestArgType(t *testing.T) {
37-
for _, test := range argTypeTests {
38-
err := checkArgType(test.input)
39-
if (err == nil) != test.expected_output {
40-
if test.expected_output {
41-
t.Errorf("Got unexpected error: %s", err)
42-
} else {
43-
t.Errorf("Expected error but got none")
44-
}
45-
}
46-
}
47-
}

pkg/util/cloud_prepper.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package util
1818

1919
import (
20+
"regexp"
21+
2022
"github.com/containers/image/docker"
2123
)
2224

@@ -25,7 +27,24 @@ type CloudPrepper struct {
2527
ImagePrepper
2628
}
2729

28-
func (p CloudPrepper) getFileSystem() (string, error) {
30+
func (p CloudPrepper) Name() string {
31+
return "Cloud Registry"
32+
}
33+
34+
func (p CloudPrepper) GetSource() string {
35+
return p.ImagePrepper.Source
36+
}
37+
38+
func (p CloudPrepper) SupportsImage() bool {
39+
pattern := regexp.MustCompile("^.+/.+(:.+){0,1}$")
40+
image := p.ImagePrepper.Source
41+
if exp := pattern.FindString(image); exp != image || CheckTar(image) {
42+
return false
43+
}
44+
return true
45+
}
46+
47+
func (p CloudPrepper) GetFileSystem() (string, error) {
2948
ref, err := docker.ParseReference("//" + p.Source)
3049
if err != nil {
3150
return "", err
@@ -34,7 +53,7 @@ func (p CloudPrepper) getFileSystem() (string, error) {
3453
return getFileSystemFromReference(ref, p.Source)
3554
}
3655

37-
func (p CloudPrepper) getConfig() (ConfigSchema, error) {
56+
func (p CloudPrepper) GetConfig() (ConfigSchema, error) {
3857
ref, err := docker.ParseReference("//" + p.Source)
3958
if err != nil {
4059
return ConfigSchema{}, err

pkg/util/daemon_prepper.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package util
1919
import (
2020
"context"
2121
"os"
22+
"regexp"
2223

2324
"github.com/golang/glog"
2425
)
@@ -27,7 +28,23 @@ type DaemonPrepper struct {
2728
ImagePrepper
2829
}
2930

30-
func (p DaemonPrepper) getFileSystem() (string, error) {
31+
func (p DaemonPrepper) Name() string {
32+
return "Local Daemon"
33+
}
34+
35+
func (p DaemonPrepper) GetSource() string {
36+
return p.ImagePrepper.Source
37+
}
38+
39+
func (p DaemonPrepper) SupportsImage() bool {
40+
pattern := regexp.MustCompile("[a-z|0-9]{12}")
41+
if exp := pattern.FindString(p.ImagePrepper.Source); exp != p.ImagePrepper.Source {
42+
return false
43+
}
44+
return true
45+
}
46+
47+
func (p DaemonPrepper) GetFileSystem() (string, error) {
3148
tarPath, err := saveImageToTar(p.Client, p.Source, p.Source)
3249
if err != nil {
3350
return "", err
@@ -37,7 +54,7 @@ func (p DaemonPrepper) getFileSystem() (string, error) {
3754
return getImageFromTar(tarPath)
3855
}
3956

40-
func (p DaemonPrepper) getConfig() (ConfigSchema, error) {
57+
func (p DaemonPrepper) GetConfig() (ConfigSchema, error) {
4158
inspect, _, err := p.Client.ImageInspectWithRaw(context.Background(), p.Source)
4259
if err != nil {
4360
return ConfigSchema{}, err
@@ -46,14 +63,14 @@ func (p DaemonPrepper) getConfig() (ConfigSchema, error) {
4663
config := ConfigObject{
4764
Env: inspect.Config.Env,
4865
}
49-
history := p.getHistory()
66+
history := p.GetHistory()
5067
return ConfigSchema{
5168
Config: config,
5269
History: history,
5370
}, nil
5471
}
5572

56-
func (p DaemonPrepper) getHistory() []ImageHistoryItem {
73+
func (p DaemonPrepper) GetHistory() []ImageHistoryItem {
5774
history, err := p.Client.ImageHistory(context.Background(), p.Source)
5875
if err != nil {
5976
glog.Error("Could not obtain image history for %s: %s", p.Source, err)

pkg/util/image_prep_utils.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,10 @@ import (
3030
"github.com/golang/glog"
3131
)
3232

33-
var sourceToPrepMap = map[string]func(ip ImagePrepper) Prepper{
34-
"ID": func(ip ImagePrepper) Prepper { return DaemonPrepper{ImagePrepper: ip} },
35-
"URL": func(ip ImagePrepper) Prepper { return CloudPrepper{ImagePrepper: ip} },
36-
"tar": func(ip ImagePrepper) Prepper { return TarPrepper{ImagePrepper: ip} },
37-
}
38-
39-
var sourceCheckMap = map[string]func(string) bool{
40-
"ID": CheckImageID,
41-
"URL": CheckImageURL,
42-
"tar": CheckTar,
33+
var orderedPreppers = []func(ip ImagePrepper) Prepper{
34+
func(ip ImagePrepper) Prepper { return DaemonPrepper{ImagePrepper: ip} },
35+
func(ip ImagePrepper) Prepper { return CloudPrepper{ImagePrepper: ip} },
36+
func(ip ImagePrepper) Prepper { return TarPrepper{ImagePrepper: ip} },
4337
}
4438

4539
type Image struct {

pkg/util/image_prepper.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,36 @@ type ImagePrepper struct {
2929
}
3030

3131
type Prepper interface {
32-
getFileSystem() (string, error)
33-
getConfig() (ConfigSchema, error)
32+
Name() string
33+
GetSource() string
34+
GetFileSystem() (string, error)
35+
GetConfig() (ConfigSchema, error)
36+
SupportsImage() bool
3437
}
3538

3639
func (p ImagePrepper) GetImage() (Image, error) {
3740
glog.Infof("Starting prep for image %s", p.Source)
3841
img := p.Source
3942

4043
var prepper Prepper
41-
for source, check := range sourceCheckMap {
42-
if check(img) {
43-
prepper = sourceToPrepMap[source](p)
44+
45+
for _, prepperConstructor := range orderedPreppers {
46+
prepper = prepperConstructor(p)
47+
if prepper.SupportsImage() {
4448
break
4549
}
4650
}
51+
4752
if prepper == nil {
4853
return Image{}, errors.New("Could not retrieve image from source")
4954
}
5055

51-
imgPath, err := prepper.getFileSystem()
56+
imgPath, err := prepper.GetFileSystem()
5257
if err != nil {
5358
return Image{}, err
5459
}
5560

56-
config, err := prepper.getConfig()
61+
config, err := prepper.GetConfig()
5762
if err != nil {
5863
glog.Error("Error retrieving History: ", err)
5964
}

pkg/util/image_utils.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"io/ioutil"
2222
"os"
2323
"path/filepath"
24-
"regexp"
2524

2625
"github.com/docker/docker/pkg/system"
2726
"github.com/golang/glog"
@@ -42,22 +41,6 @@ func GetImageLayers(pathToImage string) []string {
4241
return layers
4342
}
4443

45-
func CheckImageID(image string) bool {
46-
pattern := regexp.MustCompile("[a-z|0-9]{12}")
47-
if exp := pattern.FindString(image); exp != image {
48-
return false
49-
}
50-
return true
51-
}
52-
53-
func CheckImageURL(image string) bool {
54-
pattern := regexp.MustCompile("^.+/.+(:.+){0,1}$")
55-
if exp := pattern.FindString(image); exp != image || CheckTar(image) {
56-
return false
57-
}
58-
return true
59-
}
60-
6144
// copyToFile writes the content of the reader to the specified file
6245
func copyToFile(outfile string, r io.Reader) error {
6346
// We use sequential file access here to avoid depleting the standby list

pkg/util/tar_prepper.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,23 @@ type TarPrepper struct {
3232
ImagePrepper
3333
}
3434

35-
func (p TarPrepper) getFileSystem() (string, error) {
35+
func (p TarPrepper) Name() string {
36+
return "Tar Archive"
37+
}
38+
39+
func (p TarPrepper) GetSource() string {
40+
return p.ImagePrepper.Source
41+
}
42+
43+
func (p TarPrepper) SupportsImage() bool {
44+
return IsTar(p.ImagePrepper.Source)
45+
}
46+
47+
func (p TarPrepper) GetFileSystem() (string, error) {
3648
return getImageFromTar(p.Source)
3749
}
3850

39-
func (p TarPrepper) getConfig() (ConfigSchema, error) {
51+
func (p TarPrepper) GetConfig() (ConfigSchema, error) {
4052
tempDir := strings.TrimSuffix(p.Source, filepath.Ext(p.Source)) + "-config"
4153
defer os.RemoveAll(tempDir)
4254
err := UnTar(p.Source, tempDir)

util/image_utils_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ func TestCheckImageID(t *testing.T) {
3333
{input: "gcr.io/repo/image", expectedOutput: false},
3434
{input: "testTars/la-croix1.tar", expectedOutput: false},
3535
} {
36-
output := pkgutil.CheckImageID(test.input)
36+
prepper := pkgutil.DaemonPrepper{
37+
pkgutil.ImagePrepper{
38+
Source: test.input,
39+
},
40+
}
41+
output := prepper.SupportsImage()
3742
if output != test.expectedOutput {
3843
if test.expectedOutput {
3944
t.Errorf("Expected input to be image ID but %s tested false", test.input)
@@ -67,7 +72,12 @@ func TestCheckImageURL(t *testing.T) {
6772
{input: "gcr.io/repo/image", expectedOutput: true},
6873
{input: "testTars/la-croix1.tar", expectedOutput: false},
6974
} {
70-
output := pkgutil.CheckImageURL(test.input)
75+
prepper := pkgutil.CloudPrepper{
76+
pkgutil.ImagePrepper{
77+
Source: test.input,
78+
},
79+
}
80+
output := prepper.SupportsImage()
7181
if output != test.expectedOutput {
7282
if test.expectedOutput {
7383
t.Errorf("Expected input to be a tar file but %s tested false", test.input)

0 commit comments

Comments
 (0)