@@ -13,43 +13,44 @@ import (
13
13
"github.com/sirupsen/logrus"
14
14
15
15
"github.com/dragonflyoss/nydus/contrib/nydusify/pkg/checker/rule"
16
- "github.com/dragonflyoss/nydus/contrib/nydusify/pkg/checker/tool"
17
16
"github.com/dragonflyoss/nydus/contrib/nydusify/pkg/parser"
18
17
"github.com/dragonflyoss/nydus/contrib/nydusify/pkg/provider"
19
- "github.com/dragonflyoss/nydus/contrib/nydusify/pkg/remote"
20
18
"github.com/dragonflyoss/nydus/contrib/nydusify/pkg/utils"
21
19
)
22
20
23
21
// Opt defines Checker options.
24
- // Note: target is the Nydus image reference.
22
+ // Note: target is the nydus image reference.
25
23
type Opt struct {
26
- WorkDir string
27
- Source string
28
- Target string
29
- SourceInsecure bool
30
- TargetInsecure bool
24
+ WorkDir string
25
+
26
+ Source string
27
+ Target string
28
+ SourceInsecure bool
29
+ TargetInsecure bool
30
+ SourceBackendType string
31
+ SourceBackendConfig string
32
+ TargetBackendType string
33
+ TargetBackendConfig string
34
+
31
35
MultiPlatform bool
32
36
NydusImagePath string
33
37
NydusdPath string
34
- BackendType string
35
- BackendConfig string
36
38
ExpectedArch string
37
39
}
38
40
39
- // Checker validates Nydus image manifest, bootstrap and mounts filesystem
40
- // by Nydusd to compare file metadata and data with OCI image.
41
+ // Checker validates nydus image manifest, bootstrap and mounts filesystem
42
+ // by nydusd to compare file metadata and data between OCI / nydus image.
41
43
type Checker struct {
42
44
Opt
43
45
sourceParser * parser.Parser
44
46
targetParser * parser.Parser
45
47
}
46
48
47
- // New creates Checker instance, target is the Nydus image reference.
49
+ // New creates Checker instance, target is the nydus image reference.
48
50
func New (opt Opt ) (* Checker , error ) {
49
- // TODO: support source and target resolver
50
51
targetRemote , err := provider .DefaultRemote (opt .Target , opt .TargetInsecure )
51
52
if err != nil {
52
- return nil , errors .Wrap (err , "Init target image parser" )
53
+ return nil , errors .Wrap (err , "init target image parser" )
53
54
}
54
55
targetParser , err := parser .New (targetRemote , opt .ExpectedArch )
55
56
if err != nil {
@@ -63,7 +64,7 @@ func New(opt Opt) (*Checker, error) {
63
64
return nil , errors .Wrap (err , "Init source image parser" )
64
65
}
65
66
sourceParser , err = parser .New (sourceRemote , opt .ExpectedArch )
66
- if sourceParser = = nil {
67
+ if err ! = nil {
67
68
return nil , errors .Wrap (err , "failed to create parser" )
68
69
}
69
70
}
@@ -77,7 +78,7 @@ func New(opt Opt) (*Checker, error) {
77
78
return checker , nil
78
79
}
79
80
80
- // Check checks Nydus image, and outputs image information to work
81
+ // Check checks nydus image, and outputs image information to work
81
82
// directory, the check workflow is composed of various rules.
82
83
func (checker * Checker ) Check (ctx context.Context ) error {
83
84
if err := checker .check (ctx ); err != nil {
@@ -93,12 +94,13 @@ func (checker *Checker) Check(ctx context.Context) error {
93
94
return nil
94
95
}
95
96
96
- // Check checks Nydus image, and outputs image information to work
97
+ // Check checks nydus image, and outputs image information to work
97
98
// directory, the check workflow is composed of various rules.
98
99
func (checker * Checker ) check (ctx context.Context ) error {
100
+ logrus .WithField ("image" , checker .targetParser .Remote .Ref ).Infof ("parsing image" )
99
101
targetParsed , err := checker .targetParser .Parse (ctx )
100
102
if err != nil {
101
- return errors .Wrap (err , "parse Nydus image" )
103
+ return errors .Wrap (err , "parse nydus image" )
102
104
}
103
105
104
106
var sourceParsed * parser.Parsed
@@ -107,89 +109,66 @@ func (checker *Checker) check(ctx context.Context) error {
107
109
if err != nil {
108
110
return errors .Wrap (err , "parse source image" )
109
111
}
110
- } else {
111
- sourceParsed = targetParsed
112
112
}
113
113
114
114
if err := os .RemoveAll (checker .WorkDir ); err != nil {
115
115
return errors .Wrap (err , "clean up work directory" )
116
116
}
117
117
118
- if err := os .MkdirAll (filepath .Join (checker .WorkDir , "fs" ), 0755 ); err != nil {
119
- return errors .Wrap (err , "create work directory" )
120
- }
121
-
122
- if err := checker .Output (ctx , sourceParsed , targetParsed , checker .WorkDir ); err != nil {
123
- return errors .Wrap (err , "output image information" )
124
- }
125
-
126
- mode := "direct"
127
- digestValidate := false
128
- if targetParsed .NydusImage != nil {
129
- nydusManifest := parser .FindNydusBootstrapDesc (& targetParsed .NydusImage .Manifest )
130
- if nydusManifest != nil {
131
- v := utils .GetNydusFsVersionOrDefault (nydusManifest .Annotations , utils .V5 )
132
- if v == utils .V5 {
133
- // Digest validate is not currently supported for v6,
134
- // but v5 supports it. In order to make the check more sufficient,
135
- // this validate needs to be turned on for v5.
136
- digestValidate = true
137
- }
118
+ if sourceParsed != nil {
119
+ if err := checker .Output (ctx , sourceParsed , filepath .Join (checker .WorkDir , "source" )); err != nil {
120
+ return errors .Wrapf (err , "output image information: %s" , sourceParsed .Remote .Ref )
138
121
}
139
122
}
140
123
141
- var sourceRemote * remote.Remote
142
- if checker .sourceParser != nil {
143
- sourceRemote = checker .sourceParser .Remote
124
+ if targetParsed != nil {
125
+ if err := checker .Output (ctx , targetParsed , filepath .Join (checker .WorkDir , "target" )); err != nil {
126
+ return errors .Wrapf (err , "output image information: %s" , targetParsed .Remote .Ref )
127
+ }
144
128
}
145
129
146
130
rules := []rule.Rule {
147
131
& rule.ManifestRule {
148
- SourceParsed : sourceParsed ,
149
- TargetParsed : targetParsed ,
150
- MultiPlatform : checker .MultiPlatform ,
151
- BackendType : checker .BackendType ,
152
- ExpectedArch : checker .ExpectedArch ,
132
+ SourceParsed : sourceParsed ,
133
+ TargetParsed : targetParsed ,
153
134
},
154
135
& rule.BootstrapRule {
155
- Parsed : targetParsed ,
156
- NydusImagePath : checker .NydusImagePath ,
157
- BackendType : checker .BackendType ,
158
- BootstrapPath : filepath .Join (checker .WorkDir , "nydus_bootstrap" ),
159
- DebugOutputPath : filepath .Join (checker .WorkDir , "nydus_bootstrap_debug.json" ),
136
+ WorkDir : checker .WorkDir ,
137
+ NydusImagePath : checker .NydusImagePath ,
138
+
139
+ SourceParsed : sourceParsed ,
140
+ TargetParsed : targetParsed ,
141
+ SourceBackendType : checker .SourceBackendType ,
142
+ SourceBackendConfig : checker .SourceBackendConfig ,
143
+ TargetBackendType : checker .TargetBackendType ,
144
+ TargetBackendConfig : checker .TargetBackendConfig ,
160
145
},
161
146
& rule.FilesystemRule {
162
- Source : checker .Source ,
163
- SourceMountPath : filepath .Join (checker .WorkDir , "fs/source_mounted" ),
164
- SourceParsed : sourceParsed ,
165
- SourcePath : filepath .Join (checker .WorkDir , "fs/source" ),
166
- SourceRemote : sourceRemote ,
167
- Target : checker .Target ,
168
- TargetInsecure : checker .TargetInsecure ,
169
- PlainHTTP : checker .targetParser .Remote .IsWithHTTP (),
170
- NydusdConfig : tool.NydusdConfig {
171
- EnablePrefetch : true ,
172
- NydusdPath : checker .NydusdPath ,
173
- BackendType : checker .BackendType ,
174
- BackendConfig : checker .BackendConfig ,
175
- BootstrapPath : filepath .Join (checker .WorkDir , "nydus_bootstrap" ),
176
- ConfigPath : filepath .Join (checker .WorkDir , "fs/nydusd_config.json" ),
177
- BlobCacheDir : filepath .Join (checker .WorkDir , "fs/nydus_blobs" ),
178
- MountPath : filepath .Join (checker .WorkDir , "fs/nydus_mounted" ),
179
- APISockPath : filepath .Join (checker .WorkDir , "fs/nydus_api.sock" ),
180
- Mode : mode ,
181
- DigestValidate : digestValidate ,
147
+ WorkDir : checker .WorkDir ,
148
+ NydusdPath : checker .NydusdPath ,
149
+
150
+ SourceImage : & rule.Image {
151
+ Parsed : sourceParsed ,
152
+ Insecure : checker .SourceInsecure ,
153
+ },
154
+ TargetImage : & rule.Image {
155
+ Parsed : targetParsed ,
156
+ Insecure : checker .TargetInsecure ,
182
157
},
158
+ SourceBackendType : checker .SourceBackendType ,
159
+ SourceBackendConfig : checker .SourceBackendConfig ,
160
+ TargetBackendType : checker .TargetBackendType ,
161
+ TargetBackendConfig : checker .TargetBackendConfig ,
183
162
},
184
163
}
185
164
186
165
for _ , rule := range rules {
187
166
if err := rule .Validate (); err != nil {
188
- return errors .Wrapf (err , "validate rule %s " , rule .Name ())
167
+ return errors .Wrapf (err , "validate %s failed " , rule .Name ())
189
168
}
190
169
}
191
170
192
- logrus .Infof ( "Verified Nydus image %s" , checker . targetParser . Remote . Ref )
171
+ logrus .Info ( "verified image" )
193
172
194
173
return nil
195
174
}
0 commit comments