Skip to content

Commit f45b229

Browse files
Ruchii-27Ruchi Maheshwari
andauthored
feat: cssc patch command enhanced to support incremental patch tags (#347)
Enhance cssc patch command to support incremental patch tags --------- Co-authored-by: Ruchi Maheshwari <[email protected]>
1 parent 39a9ad4 commit f45b229

File tree

5 files changed

+644
-144
lines changed

5 files changed

+644
-144
lines changed

cmd/acr/cssc.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func newPatchFilterCmd(csscParams *csscParameters) *cobra.Command {
9696
return errors.New("patch command without --dry-run is not operational at the moment and will be enabled in future releases")
9797
} else if csscParams.dryRun {
9898
fmt.Println("DRY RUN mode enabled...")
99-
fmt.Println("DRY RUN mode will only list all the repositories and tags that match the filter and are eligible for continuous scan and patch. During the actual patch operation, each of the eligible images will first be scanned using trivy and if there are any vulnerabilities found, a new patched image will be generated with tag <originaltag>-patched.")
99+
fmt.Println("DRY RUN mode will only list all the repositories and tags that match the filter and are eligible for continuous scan and patch. During the actual patch operation, each of the eligible images will first be scanned using trivy and if there are any vulnerabilities found, a new patched image will be generated with tag <originaltag>-patched or <originaltag>-x based on the configured tag-convention.")
100100
if csscParams.filterPolicy == "" && csscParams.filterfilePath == "" {
101101
return errors.New("flag --filter-policy or --filter-policy-file is required when using --dry-run")
102102
} else if csscParams.filterfilePath != "" {
@@ -114,15 +114,19 @@ func newPatchFilterCmd(csscParams *csscParameters) *cobra.Command {
114114
}
115115
}
116116

117-
if len(filter.Repositories) == 0 {
118-
fmt.Println("Filter is empty or invalid.")
119-
return nil
117+
// Validate the filter and return error if invalid
118+
err = filter.ValidateFilter()
119+
if err != nil {
120+
return err
120121
}
121-
filteredResult, err := cssc.ApplyFilterAndGetFilteredList(ctx, acrClient, filter)
122+
123+
fmt.Println("Configured Tag Convention: ", filter.TagConvention)
124+
filteredResult, artifactsNotFound, err := cssc.ApplyFilterAndGetFilteredList(ctx, acrClient, filter)
122125
if err != nil {
123126
return err
124127
}
125-
cssc.PrintFilteredResult(filteredResult, csscParams.showPatchTags, loginURL)
128+
cssc.PrintNotFoundArtifacts(artifactsNotFound)
129+
cssc.PrintFilteredResult(filteredResult, csscParams.showPatchTags)
126130
return nil
127131
},
128132
}

internal/common/testhelper.go

Lines changed: 92 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,35 @@ import (
1010
)
1111

1212
var (
13-
TestCtx = context.Background()
14-
TestLoginURL = "foo.azurecr.io"
15-
TestRepo = "bar"
16-
17-
TagName = "latest"
18-
TagName1 = "v1"
19-
TagName2 = "v2"
20-
TagName3 = "v3"
21-
TagName4 = "v4"
22-
TagNamePatch1 = "v1-patched"
23-
TagNamePatch2 = "v2-patched"
24-
RepoName1 = "repo1"
25-
RepoName2 = "repo2"
26-
RepoName3 = "repo3"
27-
RepoName4 = "repo4"
28-
deleteEnabled = true
29-
lastUpdateTime = time.Now().Add(-15 * time.Minute).UTC().Format(time.RFC3339Nano)
30-
writeEnabled = true
31-
digest = "sha256:2830cc0fcddc1bc2bd4aeab0ed5ee7087dab29a49e65151c77553e46a7ed5283" //#nosec G101
32-
multiArchDigest = "sha256:d88fb54ba4424dada7c928c6af332ed1c49065ad85eafefb6f26664695015119" //#nosec G101
13+
TestCtx = context.Background()
14+
TestLoginURL = "foo.azurecr.io"
15+
TestRepo = "bar"
16+
TagName = "latest"
17+
TagName1 = "jammy"
18+
TagName2 = "jammy-20240808"
19+
TagName3 = "jammy-20240627.1"
20+
TagName4 = "20.04"
21+
TagName1FloatingTag = "jammy-patched"
22+
TagName2FloatingTag = "jammy-20240808-patched"
23+
TagName3FloatingTag = "jammy-20240627.1-patched"
24+
TagName4FloatingTag = "20.04-patched"
25+
TagName1Incremental1 = "jammy-1"
26+
TagName2Incremental1 = "jammy-20240808-1"
27+
TagName3Incremental1 = "jammy-20240627.1-1"
28+
TagName4Incremental1 = "20.04-1"
29+
TagName1Incremental2 = "jammy-2"
30+
TagName2Incremental2 = "jammy-20240808-2"
31+
TagName3Incremental2 = "jammy-20240627.1-2"
32+
TagName4Incremental2 = "20.04-2"
33+
RepoName1 = "repo1"
34+
RepoName2 = "repo2"
35+
RepoName3 = "repo3"
36+
RepoName4 = "repo4"
37+
deleteEnabled = true
38+
lastUpdateTime = time.Now().Add(-15 * time.Minute).UTC().Format(time.RFC3339Nano)
39+
writeEnabled = true
40+
digest = "sha256:2830cc0fcddc1bc2bd4aeab0ed5ee7087dab29a49e65151c77553e46a7ed5283" //#nosec G101
41+
multiArchDigest = "sha256:d88fb54ba4424dada7c928c6af332ed1c49065ad85eafefb6f26664695015119" //#nosec G101
3342

3443
NotFoundResponse = autorest.Response{
3544
Response: &http.Response{
@@ -104,7 +113,7 @@ var (
104113
}},
105114
}
106115

107-
FourTagResultWithPatchTags = &acr.RepositoryTagsType{
116+
FourTagsResultWithPatchTags = &acr.RepositoryTagsType{
108117
Response: autorest.Response{
109118
Response: &http.Response{
110119
StatusCode: 200,
@@ -118,7 +127,17 @@ var (
118127
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
119128
Digest: &digest,
120129
}, {
121-
Name: &TagNamePatch1,
130+
Name: &TagName1Incremental1,
131+
LastUpdateTime: &lastUpdateTime,
132+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
133+
Digest: &digest,
134+
}, {
135+
Name: &TagName1Incremental2,
136+
LastUpdateTime: &lastUpdateTime,
137+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
138+
Digest: &digest,
139+
}, {
140+
Name: &TagName1FloatingTag,
122141
LastUpdateTime: &lastUpdateTime,
123142
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
124143
Digest: &digest,
@@ -128,7 +147,57 @@ var (
128147
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
129148
Digest: &digest,
130149
}, {
131-
Name: &TagNamePatch2,
150+
Name: &TagName2Incremental1,
151+
LastUpdateTime: &lastUpdateTime,
152+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
153+
Digest: &digest,
154+
}, {
155+
Name: &TagName2Incremental2,
156+
LastUpdateTime: &lastUpdateTime,
157+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
158+
Digest: &digest,
159+
}, {
160+
Name: &TagName2FloatingTag,
161+
LastUpdateTime: &lastUpdateTime,
162+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
163+
Digest: &digest,
164+
}, {
165+
Name: &TagName3,
166+
LastUpdateTime: &lastUpdateTime,
167+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
168+
Digest: &digest,
169+
}, {
170+
Name: &TagName3Incremental1,
171+
LastUpdateTime: &lastUpdateTime,
172+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
173+
Digest: &digest,
174+
}, {
175+
Name: &TagName3Incremental2,
176+
LastUpdateTime: &lastUpdateTime,
177+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
178+
Digest: &digest,
179+
}, {
180+
Name: &TagName3FloatingTag,
181+
LastUpdateTime: &lastUpdateTime,
182+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
183+
Digest: &digest,
184+
}, {
185+
Name: &TagName4,
186+
LastUpdateTime: &lastUpdateTime,
187+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
188+
Digest: &digest,
189+
}, {
190+
Name: &TagName4Incremental1,
191+
LastUpdateTime: &lastUpdateTime,
192+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
193+
Digest: &digest,
194+
}, {
195+
Name: &TagName4Incremental2,
196+
LastUpdateTime: &lastUpdateTime,
197+
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
198+
Digest: &digest,
199+
}, {
200+
Name: &TagName4FloatingTag,
132201
LastUpdateTime: &lastUpdateTime,
133202
ChangeableAttributes: &acr.ChangeableAttributes{DeleteEnabled: &deleteEnabled, WriteEnabled: &writeEnabled},
134203
Digest: &digest,

0 commit comments

Comments
 (0)