Skip to content

Commit d9e0f09

Browse files
authored
feat: reference target with feature
* update release workflow (#1) * update release workflow * format * fix: remove build test image step * fix: Disable docker hub image tagging * fix: use a different secret to access helm-charts repo for upload * fix: move helm chart image index file to `charts` folder * Pr/develop/add progress in cached image crd (#2) * Add progress porperty in CachedImage CRD Status * Update go package name * Update readme.md (#3) * fix: Commit message. add progress in cachedimage crd * Update readme.md * Update the readme again * fix: Update Repository CRD (#5) * fix: Fix repository CRD (#6) * fix: Update README.md * feat: Add callback with progress update (#7) * Add callback with progress update * Only update progress output every 5 seconds * Fix error * fix unit test * Fix unit test * fix: Fix branding in docker build (#8) * fix: Update CRD with progress * fix: Force rebuild release * fix: reduce rate limit * fix: Add logging regardless on every call back (#10) * fix: Add more logs (#11) * Add more logs * Reduce the unit test checking * add even more logs * fix: Title (#13) * fix: Move progress update to outter loop (#14) * fix: Fix unit test (#15) * fix: Remove debug log (#16) * Revert back chagnes on github * Add missing newlines * bug * revert back change on release.json * revert * revert * Revert to original branding * rename kuikv1alpha1 to kuikv1alpha1ext1 * remove not used test * formatting
1 parent 8c437be commit d9e0f09

27 files changed

+168
-106
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ Note that persistence requires your cluster to have some PersistentVolumes. If y
217217
Sometimes, you want images to stay cached even when they are not used anymore (for instance when you run a workload for a fixed amount of time, stop it, and run it again later). You can choose to prevent `CachedImages` from expiring by manually setting the `spec.retain` flag to `true` like shown below:
218218

219219
```yaml
220-
apiVersion: kuik.enix.io/v1alpha1
220+
apiVersion: kuik.enix.io/v1alpha1ext1
221221
kind: CachedImage
222222
metadata:
223223
name: docker.io-library-nginx-1.25

api/kuik/v1alpha1/cachedimage_types.go renamed to api/kuik/v1alpha1ext1/cachedimage_types.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package v1alpha1
1+
package v1alpha1ext1
22

33
import (
44
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -26,12 +26,19 @@ type UsedBy struct {
2626
Count int `json:"count,omitempty"`
2727
}
2828

29+
type Progress struct {
30+
Total int64 `json:"total,omitempty"`
31+
Available int64 `json:"available,omitempty"`
32+
}
33+
2934
// CachedImageStatus defines the observed state of CachedImage
3035
type CachedImageStatus struct {
3136
IsCached bool `json:"isCached,omitempty"`
3237
Phase string `json:"phase,omitempty"`
3338
UsedBy UsedBy `json:"usedBy,omitempty"`
3439

40+
Progress Progress `json:"progress,omitempty"`
41+
3542
Digest string `json:"digest,omitempty"`
3643
UpstreamDigest string `json:"upstreamDigest,omitempty"`
3744
UpToDate bool `json:"upToDate,omitempty"`

api/kuik/v1alpha1/cachedimage_utils.go renamed to api/kuik/v1alpha1ext1/cachedimage_utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package v1alpha1
1+
package v1alpha1ext1
22

33
import (
44
"context"

api/kuik/v1alpha1/cachedimage_webhook.go renamed to api/kuik/v1alpha1ext1/cachedimage_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package v1alpha1
1+
package v1alpha1ext1
22

33
import (
44
"context"

api/kuik/v1alpha1/cachedimage_webhook_test.go renamed to api/kuik/v1alpha1ext1/cachedimage_webhook_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package v1alpha1
1+
package v1alpha1ext1
22

33
import (
44
"context"

api/kuik/v1alpha1/groupversion_info.go renamed to api/kuik/v1alpha1ext1/groupversion_info.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
// Package v1alpha1 contains API Schema definitions for the kuik.enix.io v1alpha1 API group
1+
// Package v1alpha1ext1 contains API Schema definitions for the kuik.enix.io v1alpha1ext1 API group
22
// +kubebuilder:object:generate=true
33
// +groupName=kuik.enix.io
4-
package v1alpha1
4+
package v1alpha1ext1
55

66
import (
77
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -10,7 +10,7 @@ import (
1010

1111
var (
1212
// GroupVersion is group version used to register these objects
13-
GroupVersion = schema.GroupVersion{Group: "kuik.enix.io", Version: "v1alpha1"}
13+
GroupVersion = schema.GroupVersion{Group: "kuik.enix.io", Version: "v1alpha1ext1"}
1414

1515
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
1616
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}

api/kuik/v1alpha1/repository_types.go renamed to api/kuik/v1alpha1ext1/repository_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package v1alpha1
1+
package v1alpha1ext1
22

33
import (
44
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

api/kuik/v1alpha1/repository_utils.go renamed to api/kuik/v1alpha1ext1/repository_utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package v1alpha1
1+
package v1alpha1ext1
22

33
import (
44
"regexp"

cmd/cache/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
1919

2020
kuikenixiov1 "github.com/enix/kube-image-keeper/api/core/v1"
21-
kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1"
21+
kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1"
2222
"github.com/enix/kube-image-keeper/internal"
2323
kuikController "github.com/enix/kube-image-keeper/internal/controller"
2424
"github.com/enix/kube-image-keeper/internal/controller/core"
@@ -116,7 +116,7 @@ func main() {
116116
Decoder: admission.NewDecoder(mgr.GetScheme()),
117117
}
118118
mgr.GetWebhookServer().Register("/mutate-core-v1-pod", &webhook.Admission{Handler: &imageRewriter})
119-
if err = (&kuikv1alpha1.CachedImage{}).SetupWebhookWithManager(mgr); err != nil {
119+
if err = (&kuikv1alpha1ext1.CachedImage{}).SetupWebhookWithManager(mgr); err != nil {
120120
setupLog.Error(err, "unable to create webhook", "webhook", "CachedImage")
121121
os.Exit(1)
122122
}

config/crd/bases/kuik.enix.io_cachedimages.yaml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ spec:
3535
- jsonPath: .metadata.creationTimestamp
3636
name: Age
3737
type: date
38-
name: v1alpha1
38+
name: v1alpha1ext1
3939
schema:
4040
openAPIV3Schema:
4141
description: CachedImage is the Schema for the cachedimages API
@@ -90,6 +90,15 @@ spec:
9090
type: string
9191
phase:
9292
type: string
93+
progress:
94+
properties:
95+
available:
96+
format: int64
97+
type: integer
98+
total:
99+
format: int64
100+
type: integer
101+
type: object
93102
upToDate:
94103
type: boolean
95104
upstreamDigest:

config/crd/bases/kuik.enix.io_repositories.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ spec:
2626
- jsonPath: .metadata.creationTimestamp
2727
name: Age
2828
type: date
29-
name: v1alpha1
29+
name: v1alpha1ext1
3030
schema:
3131
openAPIV3Schema:
3232
description: Repository is the Schema for the repositories API

config/samples/kuik_v1alpha1_cachedimage.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
apiVersion: kuik.enix.io/v1alpha1
1+
apiVersion: kuik.enix.io/v1alpha1ext1
22
kind: CachedImage
33
metadata:
44
labels:

config/samples/kuik_v1alpha1_repository.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
apiVersion: kuik.enix.io/v1alpha1
1+
apiVersion: kuik.enix.io/v1alpha1ext1
22
kind: Repository
33
metadata:
44
labels:

helm/kube-image-keeper/crds/cachedimage-crd.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ spec:
3434
- jsonPath: .metadata.creationTimestamp
3535
name: Age
3636
type: date
37-
name: v1alpha1
37+
- jsonPath: .status.progress.available
38+
name: Downloaded
39+
type: integer
40+
name: v1alpha1ext1
3841
schema:
3942
openAPIV3Schema:
4043
description: CachedImage is the Schema for the cachedimages API
@@ -93,6 +96,15 @@ spec:
9396
type: boolean
9497
upstreamDigest:
9598
type: string
99+
progress:
100+
type: object
101+
properties:
102+
total:
103+
type: integer
104+
description: Total size of the compressed blob in bytes, including all layers.
105+
available:
106+
type: integer
107+
description: Total downloaded / available size of the compressed blob in bytes, including all layers.
96108
usedBy:
97109
properties:
98110
count:

helm/kube-image-keeper/crds/repository-crd.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ spec:
2525
- jsonPath: .metadata.creationTimestamp
2626
name: Age
2727
type: date
28-
name: v1alpha1
28+
name: v1alpha1ext1
2929
schema:
3030
openAPIV3Schema:
3131
description: Repository is the Schema for the repositories API

internal/controller/collector.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"strconv"
66

7-
kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1"
7+
kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1"
88
kuikMetrics "github.com/enix/kube-image-keeper/internal/metrics"
99
"github.com/prometheus/client_golang/prometheus"
1010
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -70,7 +70,7 @@ func RegisterMetrics(client client.Client) {
7070
)
7171
}
7272

73-
func cachedImagesWithLabelValues(gaugeVec *prometheus.GaugeVec, cachedImage *kuikv1alpha1.CachedImage) prometheus.Gauge {
73+
func cachedImagesWithLabelValues(gaugeVec *prometheus.GaugeVec, cachedImage *kuikv1alpha1ext1.CachedImage) prometheus.Gauge {
7474
return gaugeVec.WithLabelValues(strconv.FormatBool(cachedImage.Status.IsCached), strconv.FormatBool(cachedImage.Spec.ExpiresAt != nil))
7575
}
7676

@@ -83,7 +83,7 @@ func (c *ControllerCollector) Describe(ch chan<- *prometheus.Desc) {
8383
}
8484

8585
func (c *ControllerCollector) Collect(ch chan<- prometheus.Metric) {
86-
cachedImageList := &kuikv1alpha1.CachedImageList{}
86+
cachedImageList := &kuikv1alpha1ext1.CachedImageList{}
8787
if err := c.List(context.Background(), cachedImageList); err == nil {
8888
cachedImageGaugeVec := prometheus.NewGaugeVec(
8989
prometheus.GaugeOpts{

internal/controller/core/pod_controller.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"k8s.io/apimachinery/pkg/types"
1313

1414
"github.com/distribution/reference"
15-
kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1"
15+
kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1"
1616
"github.com/enix/kube-image-keeper/internal/registry"
1717
corev1 "k8s.io/api/core/v1"
1818
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -92,7 +92,7 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
9292
}
9393

9494
for _, cachedImage := range cachedImages {
95-
var ci kuikv1alpha1.CachedImage
95+
var ci kuikv1alpha1ext1.CachedImage
9696
err := r.Get(ctx, client.ObjectKeyFromObject(&cachedImage), &ci)
9797
if err != nil && !apierrors.IsNotFound(err) {
9898
return ctrl.Result{}, err
@@ -141,7 +141,7 @@ func (r *PodReconciler) SetupWithManager(mgr ctrl.Manager) error {
141141
return ok
142142
}))).
143143
Watches(
144-
&kuikv1alpha1.CachedImage{},
144+
&kuikv1alpha1ext1.CachedImage{},
145145
handler.EnqueueRequestsFromMapFunc(r.podsWithDeletingCachedImages),
146146
builder.WithPredicates(p),
147147
).
@@ -154,8 +154,8 @@ func (r *PodReconciler) podsWithDeletingCachedImages(ctx context.Context, obj cl
154154
WithName("controller-runtime.manager.controller.pod.deletingCachedImages").
155155
WithValues("cachedImage", klog.KObj(obj))
156156

157-
cachedImage := obj.(*kuikv1alpha1.CachedImage)
158-
var currentCachedImage kuikv1alpha1.CachedImage
157+
cachedImage := obj.(*kuikv1alpha1ext1.CachedImage)
158+
var currentCachedImage kuikv1alpha1ext1.CachedImage
159159
// wait for the CachedImage to be really deleted
160160
if err := r.Get(ctx, client.ObjectKeyFromObject(cachedImage), &currentCachedImage); err == nil || !apierrors.IsNotFound(err) {
161161
return make([]ctrl.Request, 0)
@@ -187,8 +187,8 @@ func (r *PodReconciler) podsWithDeletingCachedImages(ctx context.Context, obj cl
187187
return make([]ctrl.Request, 0)
188188
}
189189

190-
func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod, cachedImages []kuikv1alpha1.CachedImage) ([]kuikv1alpha1.Repository, error) {
191-
repositories := map[string]kuikv1alpha1.Repository{}
190+
func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod, cachedImages []kuikv1alpha1ext1.CachedImage) ([]kuikv1alpha1ext1.Repository, error) {
191+
repositories := map[string]kuikv1alpha1ext1.Repository{}
192192

193193
pullSecretNames, err := r.imagePullSecretNamesFromPod(ctx, pod)
194194
if err != nil {
@@ -201,11 +201,11 @@ func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod
201201
return nil, err
202202
}
203203
repositoryName := named.Name()
204-
repositories[repositoryName] = kuikv1alpha1.Repository{
204+
repositories[repositoryName] = kuikv1alpha1ext1.Repository{
205205
ObjectMeta: metav1.ObjectMeta{
206206
Name: registry.SanitizeName(repositoryName),
207207
},
208-
Spec: kuikv1alpha1.RepositorySpec{
208+
Spec: kuikv1alpha1ext1.RepositorySpec{
209209
Name: repositoryName,
210210
PullSecretNames: pullSecretNames,
211211
PullSecretsNamespace: pod.Namespace,
@@ -216,15 +216,15 @@ func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod
216216
return maps.Values(repositories), nil
217217
}
218218

219-
func DesiredCachedImages(ctx context.Context, pod *corev1.Pod) []kuikv1alpha1.CachedImage {
219+
func DesiredCachedImages(ctx context.Context, pod *corev1.Pod) []kuikv1alpha1ext1.CachedImage {
220220
cachedImages := desiredCachedImagesForContainers(ctx, pod.Spec.Containers, pod.Annotations, false)
221221
cachedImages = append(cachedImages, desiredCachedImagesForContainers(ctx, pod.Spec.InitContainers, pod.Annotations, true)...)
222222
return cachedImages
223223
}
224224

225-
func desiredCachedImagesForContainers(ctx context.Context, containers []corev1.Container, annotations map[string]string, initContainer bool) []kuikv1alpha1.CachedImage {
225+
func desiredCachedImagesForContainers(ctx context.Context, containers []corev1.Container, annotations map[string]string, initContainer bool) []kuikv1alpha1ext1.CachedImage {
226226
log := log.FromContext(ctx)
227-
cachedImages := []kuikv1alpha1.CachedImage{}
227+
cachedImages := []kuikv1alpha1ext1.CachedImage{}
228228

229229
for _, container := range containers {
230230
annotationKey := registry.ContainerAnnotationKey(container.Name, initContainer)
@@ -249,7 +249,7 @@ func desiredCachedImagesForContainers(ctx context.Context, containers []corev1.C
249249
return cachedImages
250250
}
251251

252-
func cachedImageFromSourceImage(sourceImage string) (*kuikv1alpha1.CachedImage, error) {
252+
func cachedImageFromSourceImage(sourceImage string) (*kuikv1alpha1ext1.CachedImage, error) {
253253
ref, err := reference.ParseAnyReference(sourceImage)
254254
if err != nil {
255255
return nil, err
@@ -260,12 +260,12 @@ func cachedImageFromSourceImage(sourceImage string) (*kuikv1alpha1.CachedImage,
260260
sanitizedName += "-latest"
261261
}
262262

263-
cachedImage := kuikv1alpha1.CachedImage{
264-
TypeMeta: metav1.TypeMeta{APIVersion: kuikv1alpha1.GroupVersion.String(), Kind: "CachedImage"},
263+
cachedImage := kuikv1alpha1ext1.CachedImage{
264+
TypeMeta: metav1.TypeMeta{APIVersion: kuikv1alpha1ext1.GroupVersion.String(), Kind: "CachedImage"},
265265
ObjectMeta: metav1.ObjectMeta{
266266
Name: sanitizedName,
267267
},
268-
Spec: kuikv1alpha1.CachedImageSpec{
268+
Spec: kuikv1alpha1ext1.CachedImageSpec{
269269
SourceImage: sourceImage,
270270
},
271271
}

internal/controller/core/pod_controller_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"testing"
66
"time"
77

8-
kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1"
8+
kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1"
99
"github.com/enix/kube-image-keeper/internal/registry"
1010
. "github.com/onsi/ginkgo/v2"
1111
. "github.com/onsi/gomega"
@@ -57,19 +57,19 @@ func TestDesiredCachedImages(t *testing.T) {
5757
tests := []struct {
5858
name string
5959
pod corev1.Pod
60-
cachedImages []kuikv1alpha1.CachedImage
60+
cachedImages []kuikv1alpha1ext1.CachedImage
6161
}{
6262
{
6363
name: "basic",
6464
pod: podStub,
65-
cachedImages: []kuikv1alpha1.CachedImage{
66-
{Spec: kuikv1alpha1.CachedImageSpec{
65+
cachedImages: []kuikv1alpha1ext1.CachedImage{
66+
{Spec: kuikv1alpha1ext1.CachedImageSpec{
6767
SourceImage: "nginx",
6868
}},
69-
{Spec: kuikv1alpha1.CachedImageSpec{
69+
{Spec: kuikv1alpha1ext1.CachedImageSpec{
7070
SourceImage: "busybox",
7171
}},
72-
{Spec: kuikv1alpha1.CachedImageSpec{
72+
{Spec: kuikv1alpha1ext1.CachedImageSpec{
7373
SourceImage: "alpine",
7474
}},
7575
},
@@ -146,16 +146,16 @@ var _ = Describe("Pod Controller", func() {
146146
podStubNotRewritten.ResourceVersion = ""
147147

148148
By("Deleting all cached images")
149-
Expect(k8sClient.DeleteAllOf(context.Background(), &kuikv1alpha1.CachedImage{})).Should(Succeed())
149+
Expect(k8sClient.DeleteAllOf(context.Background(), &kuikv1alpha1ext1.CachedImage{})).Should(Succeed())
150150
})
151151

152152
Context("Pod with containers and init containers", func() {
153153
It("Should handle CachedImages creation and deletion", func() {
154154
By("Creating a pod")
155155
Expect(k8sClient.Create(context.Background(), &podStub)).Should(Succeed())
156156

157-
fetched := &kuikv1alpha1.CachedImageList{}
158-
Eventually(func() []kuikv1alpha1.CachedImage {
157+
fetched := &kuikv1alpha1ext1.CachedImageList{}
158+
Eventually(func() []kuikv1alpha1ext1.CachedImage {
159159
_ = k8sClient.List(context.Background(), fetched)
160160
return fetched.Items
161161
}, timeout, interval).Should(HaveLen(len(podStub.Spec.Containers) + len(podStub.Spec.InitContainers)))
@@ -177,8 +177,8 @@ var _ = Describe("Pod Controller", func() {
177177
By("Creating a pod without rewriting images")
178178
Expect(k8sClient.Create(context.Background(), &podStubNotRewritten)).Should(Succeed())
179179

180-
fetched := &kuikv1alpha1.CachedImageList{}
181-
Eventually(func() []kuikv1alpha1.CachedImage {
180+
fetched := &kuikv1alpha1ext1.CachedImageList{}
181+
Eventually(func() []kuikv1alpha1ext1.CachedImage {
182182
_ = k8sClient.List(context.Background(), fetched)
183183
return fetched.Items
184184
}, timeout, interval).Should(HaveLen(0))

0 commit comments

Comments
 (0)