-
Notifications
You must be signed in to change notification settings - Fork 78
Description
Current Behavior
Currently, the image-reflector-controller in FluxCD limits the number of latest tags to 10 for all ImageRepository resources. This is hardcoded in the getLatestTags function:
| const latestTagsCount = 10 |
image-reflector-controller/internal/controller/imagerepository_controller.go
Lines 630 to 642 in 15a1b09
| func getLatestTags(tags []string) []string { | |
| var result []string | |
| sort.SliceStable(tags, func(i, j int) bool { return tags[i] > tags[j] }) | |
| if len(tags) >= latestTagsCount { | |
| latestTags := tags[0:latestTagsCount] | |
| result = append(result, latestTags...) | |
| } else { | |
| result = append(result, tags...) | |
| } | |
| return result | |
| } | |
Desired Behavior
We would like to make the number of latest tags configurable on a per-ImageRepository basis, with a default of 10. This would allow users to retrieve more (or fewer) latest tags as needed for specific repositories.
Proposed Solution
We propose adding a latestTagsCount field to the ImageRepository spec:
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: app1
namespace: apps
spec:
latestTagsCount: 100 # New field
interval: 1h
image: docker.io/org/image
exclusionList:
- "^.*\\.sig$"
- "1.0.2"
- "1.1.1|1.0.0"Implementation Details
- Update the ImageRepository CRD to include the new
latestTagsCountfield. - Modify the
getLatestTagsfunction to accept a parameter for the count:
func getLatestTags(tags []string, count int) []string {
// ... implementation using the provided count
}- Update the controller logic to use the specified count from the ImageRepository spec, falling back to the default of 10 if not specified.
Benefits of Increasing Latest Tags Count
-
Better visibility into recent releases: For projects with frequent releases or using date-based versioning, having access to more than 10 latest tags provides a more comprehensive view of recent project history.
-
Improved automation capabilities: With more tags available, users can create more sophisticated automation workflows, such as rolling back to specific versions or tracking longer-term trends in releases.
-
Enhanced compatibility with various versioning schemes: Some projects may use versioning schemes that produce many tags in a short time (e.g., build numbers or git commit hashes). A higher tag count allows for better compatibility with these schemes.
-
More flexible image selection: Users can implement more nuanced policies for selecting images based on a larger pool of recent tags.
-
Better support for canary releases and A/B testing: With access to more tags, users can more easily manage multiple versions of an application for testing or gradual rollout purposes.
Using CEL for Validation
To ensure that the latestTagsCount is not set to a value less than 10, we can use Common Expression Language (CEL) for validation. Here's an example of how to implement this validation:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: imagerepositories.image.toolkit.fluxcd.io
spec:
# ... other CRD fields ...
versions:
- name: v1beta2
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
latestTagsCount:
type: integer
default: 10
x-kubernetes-validations:
- rule: "has(self.latestTagsCount) ? self.latestTagsCount >= 10 : true"
message: "latestTagsCount must be greater than or equal to 10"This CEL rule does the following:
- It checks if
latestTagsCountis present in the spec. - If it is present, it validates that the value is greater than or equal to 10.
- If it's not present, the validation passes (allowing the default value of 10 to be used).
This approach ensures that users can increase the latestTagsCount beyond 10, but prevents them from setting it to a value less than 10, maintaining a minimum level of recent tag history.