diff --git a/api/resource/definitions/cri/cri.proto b/api/resource/definitions/cri/cri.proto
index e3c830ceb9..7e9a7eb020 100755
--- a/api/resource/definitions/cri/cri.proto
+++ b/api/resource/definitions/cri/cri.proto
@@ -13,6 +13,7 @@ import "resource/definitions/enums/enums.proto";
message ImageCacheConfigSpec {
talos.resource.definitions.enums.CriImageCacheStatus status = 1;
repeated string roots = 2;
+ talos.resource.definitions.enums.CriImageCacheCopyStatus copy_status = 3;
}
// RegistriesConfigSpec describes status of rendered secrets.
diff --git a/api/resource/definitions/enums/enums.proto b/api/resource/definitions/enums/enums.proto
index d169afec9a..90287b97f1 100755
--- a/api/resource/definitions/enums/enums.proto
+++ b/api/resource/definitions/enums/enums.proto
@@ -404,6 +404,14 @@ enum CriImageCacheStatus {
IMAGE_CACHE_STATUS_READY = 3;
}
+// CriImageCacheCopyStatus describes image cache copy status type.
+enum CriImageCacheCopyStatus {
+ IMAGE_CACHE_COPY_STATUS_UNKNOWN = 0;
+ IMAGE_CACHE_COPY_STATUS_SKIPPED = 1;
+ IMAGE_CACHE_COPY_STATUS_PENDING = 2;
+ IMAGE_CACHE_COPY_STATUS_READY = 3;
+}
+
// KubespanPeerState is KubeSpan peer current state.
enum KubespanPeerState {
PEER_STATE_UNKNOWN = 0;
diff --git a/hack/release.toml b/hack/release.toml
index 00e712c42e..fdff906fbe 100644
--- a/hack/release.toml
+++ b/hack/release.toml
@@ -155,7 +155,12 @@ search default.svc.cluster.local svc.cluster.local cluster.local my-custom-searc
nameserver 10.96.0.10
options ndots:5
```
+"""
+ [notes.image-cache]
+ title = "Image Cache"
+ description = """\
+Talos now supports providing a local [Image Cache](https://www.talos.dev/v1.9/talos-guides/configuration/image-cache/) for container images.
"""
[make_deps]
diff --git a/internal/app/machined/pkg/controllers/cri/image_cache_config.go b/internal/app/machined/pkg/controllers/cri/image_cache_config.go
index b03b2ce807..d937f369ac 100644
--- a/internal/app/machined/pkg/controllers/cri/image_cache_config.go
+++ b/internal/app/machined/pkg/controllers/cri/image_cache_config.go
@@ -7,11 +7,15 @@ package cri
import (
"context"
"fmt"
+ "io"
+ "io/fs"
+ "os"
"path/filepath"
"github.com/cosi-project/runtime/pkg/controller"
"github.com/cosi-project/runtime/pkg/safe"
"github.com/cosi-project/runtime/pkg/state"
+ "github.com/dustin/go-humanize"
"github.com/google/cel-go/common/operators"
"github.com/google/cel-go/common/types"
"github.com/siderolabs/gen/optional"
@@ -42,6 +46,10 @@ type ServiceManager interface {
type ImageCacheConfigController struct {
V1Alpha1ServiceManager ServiceManager
VolumeMounter func(label string, opts ...mountv2.NewPointOption) error
+
+ DisableCacheCopy bool // used for testing
+
+ cacheCopyDone bool
}
// Name implements controller.StatsController interface.
@@ -100,7 +108,7 @@ const (
// Run implements controller.StatsController interface.
//
//nolint:gocyclo,cyclop
-func (ctrl *ImageCacheConfigController) Run(ctx context.Context, r controller.Runtime, _ *zap.Logger) error {
+func (ctrl *ImageCacheConfigController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) error {
for {
select {
case <-ctx.Done():
@@ -122,12 +130,15 @@ func (ctrl *ImageCacheConfigController) Run(ctx context.Context, r controller.Ru
imageCacheDisabled := cfg == nil || cfg.Config().Machine() == nil || !cfg.Config().Machine().Features().ImageCache().LocalEnabled()
var (
- status cri.ImageCacheStatus
- roots []string
+ status cri.ImageCacheStatus
+ copyStatus cri.ImageCacheCopyStatus
+ roots []string
+ allReady bool
)
if imageCacheDisabled {
status = cri.ImageCacheStatusDisabled
+ copyStatus = cri.ImageCacheCopyStatusSkipped
} else {
status = cri.ImageCacheStatusPreparing
@@ -140,22 +151,15 @@ func (ctrl *ImageCacheConfigController) Run(ctx context.Context, r controller.Ru
return fmt.Errorf("error creating volume config: %w", err)
}
- allReady := false
-
- // analyze volume statuses, and build the roots
- for _, volumeID := range []string{VolumeImageCacheISO, VolumeImageCacheDISK} {
- root, ready, err := ctrl.getImageCacheRoot(ctx, r, volumeID)
- if err != nil {
- return fmt.Errorf("error getting image cache root: %w", err)
- }
-
- allReady = allReady && ready
-
- if rootPath, ok := root.Get(); ok {
- roots = append(roots, rootPath)
- }
+ cacheVolumeStatus, err := ctrl.analyzeImageCacheVolumes(ctx, logger, r)
+ if err != nil {
+ return fmt.Errorf("error analyzing image cache volumes: %w", err)
}
+ allReady = cacheVolumeStatus.allReady
+ roots = cacheVolumeStatus.roots
+ copyStatus = cacheVolumeStatus.copyStatus
+
if allReady && len(roots) == 0 {
// all volumes identified, but no roots found
status = cri.ImageCacheStatusDisabled
@@ -181,6 +185,7 @@ func (ctrl *ImageCacheConfigController) Run(ctx context.Context, r controller.Ru
if err = safe.WriterModify(ctx, r, cri.NewImageCacheConfig(), func(cfg *cri.ImageCacheConfig) error {
cfg.TypedSpec().Status = status
+ cfg.TypedSpec().CopyStatus = copyStatus
cfg.TypedSpec().Roots = roots
return nil
@@ -272,6 +277,7 @@ func (ctrl *ImageCacheConfigController) createVolumeConfigDisk(ctx context.Conte
}
if extraCfg, ok := cfg.Volumes().ByName(constants.ImageCachePartitionLabel); ok {
+ volumeCfg.TypedSpec().Provisioning.Wave = block.WaveSystemDisk
volumeCfg.TypedSpec().Provisioning.DiskSelector.Match = extraCfg.Provisioning().DiskSelector().ValueOr(*diskExpr)
volumeCfg.TypedSpec().Provisioning.PartitionSpec.Grow = extraCfg.Provisioning().Grow().ValueOr(false)
volumeCfg.TypedSpec().Provisioning.PartitionSpec.MinSize = extraCfg.Provisioning().MinSize().ValueOr(MinImageCacheSize)
@@ -287,16 +293,116 @@ func (ctrl *ImageCacheConfigController) createVolumeConfigDisk(ctx context.Conte
})
}
-func (ctrl *ImageCacheConfigController) getImageCacheRoot(ctx context.Context, r controller.Reader, volumeID string) (optional.Optional[string], bool, error) {
- volumeStatus, err := safe.ReaderGetByID[*block.VolumeStatus](ctx, r, volumeID)
- if err != nil {
- if state.IsNotFoundError(err) {
- return optional.None[string](), false, nil
+type imageCacheVolumeStatus struct {
+ roots []string
+ allReady bool
+ copyStatus cri.ImageCacheCopyStatus
+}
+
+//nolint:gocyclo,cyclop
+func (ctrl *ImageCacheConfigController) analyzeImageCacheVolumes(ctx context.Context, logger *zap.Logger, r controller.Reader) (*imageCacheVolumeStatus, error) {
+ volumeIDs := []string{VolumeImageCacheDISK, VolumeImageCacheISO} // prefer disk cache over ISO cache
+ volumeStatuses := make([]*block.VolumeStatus, 0, len(volumeIDs))
+
+ for _, volumeID := range volumeIDs {
+ volumeStatus, err := safe.ReaderGetByID[*block.VolumeStatus](ctx, r, volumeID)
+ if err != nil {
+ if state.IsNotFoundError(err) {
+ // wait for volume statuses to be present
+ return &imageCacheVolumeStatus{}, nil
+ }
+
+ return nil, fmt.Errorf("error getting volume status: %w", err)
+ }
+
+ volumeStatuses = append(volumeStatuses, volumeStatus)
+ }
+
+ // we need to ensure that we first wait for the ISO to be either missing or ready,
+ // so that we can make a decision on copying the image cache from an ISO to the disk volume
+ var isoStatus, diskStatus block.VolumePhase
+
+ for _, volumeStatus := range volumeStatuses {
+ switch volumeStatus.Metadata().ID() {
+ case VolumeImageCacheISO:
+ isoStatus = volumeStatus.TypedSpec().Phase
+ case VolumeImageCacheDISK:
+ diskStatus = volumeStatus.TypedSpec().Phase
+ }
+ }
+
+ if isoStatus != block.VolumePhaseMissing && isoStatus != block.VolumePhaseReady {
+ return &imageCacheVolumeStatus{}, nil
+ }
+
+ isoPresent := isoStatus == block.VolumePhaseReady
+ diskMissing := diskStatus == block.VolumePhaseMissing
+
+ roots := make([]string, 0, len(volumeIDs))
+
+ var (
+ allReady, isoReady, diskReady bool
+ copySource, copyTarget string
+ )
+
+ // analyze volume statuses, and build the roots
+ for _, volumeStatus := range volumeStatuses {
+ // mount as rw only disk cache if the ISO cache is present
+ root, ready, err := ctrl.getImageCacheRoot(ctx, r, volumeStatus, !(volumeStatus.Metadata().ID() == VolumeImageCacheDISK && isoPresent))
+ if err != nil {
+ return nil, fmt.Errorf("error getting image cache root: %w", err)
+ }
+
+ if ready {
+ switch volumeStatus.Metadata().ID() {
+ case VolumeImageCacheISO:
+ isoReady = true
+ copySource = root.ValueOr("")
+ case VolumeImageCacheDISK:
+ diskReady = true
+ copyTarget = root.ValueOr("")
+ }
+ }
+
+ allReady = allReady && ready
+
+ if rootPath, ok := root.Get(); ok {
+ roots = append(roots, rootPath)
+ }
+ }
+
+ var copyStatus cri.ImageCacheCopyStatus
+
+ switch {
+ case !isoPresent:
+ // if there's no ISO, we don't need to copy anything
+ copyStatus = cri.ImageCacheCopyStatusSkipped
+ case diskMissing:
+ // if the disk volume is not configured, we can't copy the image cache
+ copyStatus = cri.ImageCacheCopyStatusSkipped
+ case ctrl.cacheCopyDone:
+ // if the copy has already been done, we don't need to do it again
+ copyStatus = cri.ImageCacheCopyStatusReady
+ case isoReady && diskReady:
+ // ready to copy
+ if err := ctrl.copyImageCache(ctx, logger, copySource, copyTarget); err != nil {
+ return nil, fmt.Errorf("error copying image cache: %w", err)
}
- return optional.None[string](), false, fmt.Errorf("error getting volume status: %w", err)
+ copyStatus = cri.ImageCacheCopyStatusReady
+ default:
+ // waiting for copy preconditions
+ copyStatus = cri.ImageCacheCopyStatusPending
}
+ return &imageCacheVolumeStatus{
+ roots: roots,
+ allReady: allReady,
+ copyStatus: copyStatus,
+ }, nil
+}
+
+func (ctrl *ImageCacheConfigController) getImageCacheRoot(ctx context.Context, r controller.Reader, volumeStatus *block.VolumeStatus, mountReadyOnly bool) (optional.Optional[string], bool, error) {
switch volumeStatus.TypedSpec().Phase { //nolint:exhaustive
case block.VolumePhaseMissing:
// image cache is missing
@@ -308,12 +414,20 @@ func (ctrl *ImageCacheConfigController) getImageCacheRoot(ctx context.Context, r
return optional.None[string](), false, nil
}
+ volumeID := volumeStatus.Metadata().ID()
+
volumeConfig, err := safe.ReaderGetByID[*block.VolumeConfig](ctx, r, volumeID)
if err != nil {
return optional.None[string](), false, fmt.Errorf("error getting volume config: %w", err)
}
- if err = ctrl.VolumeMounter(volumeID, mountv2.WithReadonly()); err != nil {
+ var mountOpts []mountv2.NewPointOption
+
+ if mountReadyOnly {
+ mountOpts = append(mountOpts, mountv2.WithReadonly())
+ }
+
+ if err = ctrl.VolumeMounter(volumeID, mountOpts...); err != nil {
return optional.None[string](), false, fmt.Errorf("error mounting volume: %w", err)
}
@@ -326,3 +440,105 @@ func (ctrl *ImageCacheConfigController) getImageCacheRoot(ctx context.Context, r
return optional.Some(targetPath), true, nil
}
+
+func (ctrl *ImageCacheConfigController) copyImageCache(ctx context.Context, logger *zap.Logger, source, target string) error {
+ logger.Info("copying image cache", zap.String("source", source), zap.String("target", target))
+
+ if ctrl.DisableCacheCopy {
+ // used for testing
+ return nil
+ }
+
+ var bytesCopied int64
+
+ if err := filepath.WalkDir(source, func(path string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return fmt.Errorf("error walking source directory: %w", err)
+ }
+
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ }
+
+ relPath, err := filepath.Rel(source, path)
+ if err != nil {
+ return fmt.Errorf("error getting relative path: %w", err)
+ }
+
+ targetPath := filepath.Join(target, relPath)
+
+ info, err := d.Info()
+ if err != nil {
+ return fmt.Errorf("error getting file info: %w", err)
+ }
+
+ // we only support directories and files
+ switch {
+ case info.Mode().IsDir():
+ if err := os.MkdirAll(targetPath, 0o755); err != nil {
+ return fmt.Errorf("error creating directory: %w", err)
+ }
+
+ return nil
+ case info.Mode().IsRegular():
+ bytesCopied += info.Size()
+
+ return copyFileSafe(path, targetPath)
+ default:
+ return fmt.Errorf("unsupported file type %s: %s", info.Mode(), path)
+ }
+ }); err != nil {
+ return fmt.Errorf("error copying image cache: %w", err)
+ }
+
+ logger.Info("image cache copied", zap.String("size", humanize.IBytes(uint64(bytesCopied))))
+
+ ctrl.cacheCopyDone = true
+
+ return nil
+}
+
+func copyFileSafe(src, dst string) error {
+ srcStat, err := os.Stat(src)
+ if err != nil {
+ return fmt.Errorf("error getting source file info: %w", err)
+ }
+
+ dstStat, err := os.Stat(dst)
+ if err == nil && srcStat.Size() == dstStat.Size() {
+ // skipping copy
+ return nil
+ }
+
+ srcFile, err := os.Open(src)
+ if err != nil {
+ return fmt.Errorf("error opening source file: %w", err)
+ }
+
+ defer srcFile.Close() //nolint:errcheck
+
+ tempPath := dst + ".tmp"
+
+ dstFile, err := os.Create(tempPath)
+ if err != nil {
+ return fmt.Errorf("error creating destination file: %w", err)
+ }
+
+ defer dstFile.Close() //nolint:errcheck
+
+ if _, err = io.Copy(dstFile, srcFile); err != nil {
+ return fmt.Errorf("error copying file: %w", err)
+ }
+
+ if err = dstFile.Close(); err != nil {
+ return fmt.Errorf("error closing destination file: %w", err)
+ }
+
+ if err = os.Rename(tempPath, dst); err != nil {
+ return fmt.Errorf("error renaming file: %w", err)
+ }
+
+ return nil
+}
diff --git a/internal/app/machined/pkg/controllers/cri/image_cache_config_test.go b/internal/app/machined/pkg/controllers/cri/image_cache_config_test.go
index c86f26cf83..7935ad216d 100644
--- a/internal/app/machined/pkg/controllers/cri/image_cache_config_test.go
+++ b/internal/app/machined/pkg/controllers/cri/image_cache_config_test.go
@@ -32,6 +32,7 @@ import (
func (suite *ImageCacheConfigSuite) TestReconcileNoConfig() {
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusDisabled, r.TypedSpec().Status)
+ asrt.Equal(cri.ImageCacheCopyStatusSkipped, r.TypedSpec().CopyStatus)
})
}
@@ -44,6 +45,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileFeatureNotEnabled() {
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusDisabled, r.TypedSpec().Status)
+ asrt.Equal(cri.ImageCacheCopyStatusSkipped, r.TypedSpec().CopyStatus)
})
}
@@ -69,6 +71,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileFeatureEnabled() {
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusPreparing, r.TypedSpec().Status)
+ asrt.Equal(cri.ImageCacheCopyStatusUnknown, r.TypedSpec().CopyStatus)
})
suite.Assert().Empty(suite.getMountedVolumes())
@@ -85,6 +88,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileFeatureEnabled() {
// one volume is ready, but second one is not (yet)
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusPreparing, r.TypedSpec().Status)
+ asrt.Equal(cri.ImageCacheCopyStatusPending, r.TypedSpec().CopyStatus)
asrt.Equal([]string{filepath.Join(constants.ImageCacheISOMountPoint, "imagecache")}, r.TypedSpec().Roots)
})
@@ -97,7 +101,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileFeatureEnabled() {
// now both volumes are ready, but service hasn't started yet
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusPreparing, r.TypedSpec().Status)
- asrt.Equal([]string{filepath.Join(constants.ImageCacheISOMountPoint, "imagecache"), constants.ImageCacheDiskMountPoint}, r.TypedSpec().Roots)
+ asrt.Equal([]string{constants.ImageCacheDiskMountPoint, filepath.Join(constants.ImageCacheISOMountPoint, "imagecache")}, r.TypedSpec().Roots)
})
suite.Assert().Equal([]string{crictrl.VolumeImageCacheISO, crictrl.VolumeImageCacheDISK}, suite.getMountedVolumes())
@@ -111,7 +115,8 @@ func (suite *ImageCacheConfigSuite) TestReconcileFeatureEnabled() {
// now both volumes are ready, and service is ready, should be ready
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusReady, r.TypedSpec().Status)
- asrt.Equal([]string{filepath.Join(constants.ImageCacheISOMountPoint, "imagecache"), constants.ImageCacheDiskMountPoint}, r.TypedSpec().Roots)
+ asrt.Equal(cri.ImageCacheCopyStatusReady, r.TypedSpec().CopyStatus)
+ asrt.Equal([]string{constants.ImageCacheDiskMountPoint, filepath.Join(constants.ImageCacheISOMountPoint, "imagecache")}, r.TypedSpec().Roots)
})
}
@@ -147,6 +152,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileWithImageCacheVolume() {
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusPreparing, r.TypedSpec().Status)
+ asrt.Equal(cri.ImageCacheCopyStatusUnknown, r.TypedSpec().CopyStatus)
})
// create volume statuses to simulate the volume being ready & missing
@@ -167,6 +173,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileWithImageCacheVolume() {
// now both volumes are ready, and service is ready, should be ready
ctest.AssertResource(suite, cri.ImageCacheConfigID, func(r *cri.ImageCacheConfig, asrt *assert.Assertions) {
asrt.Equal(cri.ImageCacheStatusReady, r.TypedSpec().Status)
+ asrt.Equal(cri.ImageCacheCopyStatusSkipped, r.TypedSpec().CopyStatus)
asrt.Equal([]string{constants.ImageCacheDiskMountPoint}, r.TypedSpec().Roots)
})
}
@@ -206,6 +213,7 @@ func TestImageCacheConfigSuite(t *testing.T) {
return nil
},
V1Alpha1ServiceManager: &mockServiceRunner{},
+ DisableCacheCopy: true,
}))
}
diff --git a/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go b/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go
index e6d1a93eff..ebd628f0c0 100644
--- a/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go
+++ b/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go
@@ -1763,6 +1763,11 @@ func Install(runtime.Sequence, any) (runtime.TaskExecutionFunc, string) {
logger.Println("install successful")
+ logger.Printf("waiting for the image cache copy")
+
+ if err = crires.WaitForImageCacheCopy(ctx, r.State().V1Alpha2().Resources()); err != nil {
+ return fmt.Errorf("failed to wait for the image cache: %w", err)
+ }
case r.State().Machine().IsInstallStaged():
systemDisk, err := blockres.GetSystemDisk(ctx, r.State().V1Alpha2().Resources())
if err != nil {
diff --git a/pkg/machinery/api/resource/definitions/cri/cri.pb.go b/pkg/machinery/api/resource/definitions/cri/cri.pb.go
index dc7b2e08c3..4d88c444f7 100644
--- a/pkg/machinery/api/resource/definitions/cri/cri.pb.go
+++ b/pkg/machinery/api/resource/definitions/cri/cri.pb.go
@@ -31,8 +31,9 @@ type ImageCacheConfigSpec struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Status enums.CriImageCacheStatus `protobuf:"varint,1,opt,name=status,proto3,enum=talos.resource.definitions.enums.CriImageCacheStatus" json:"status,omitempty"`
- Roots []string `protobuf:"bytes,2,rep,name=roots,proto3" json:"roots,omitempty"`
+ Status enums.CriImageCacheStatus `protobuf:"varint,1,opt,name=status,proto3,enum=talos.resource.definitions.enums.CriImageCacheStatus" json:"status,omitempty"`
+ Roots []string `protobuf:"bytes,2,rep,name=roots,proto3" json:"roots,omitempty"`
+ CopyStatus enums.CriImageCacheCopyStatus `protobuf:"varint,3,opt,name=copy_status,json=copyStatus,proto3,enum=talos.resource.definitions.enums.CriImageCacheCopyStatus" json:"copy_status,omitempty"`
}
func (x *ImageCacheConfigSpec) Reset() {
@@ -79,6 +80,13 @@ func (x *ImageCacheConfigSpec) GetRoots() []string {
return nil
}
+func (x *ImageCacheConfigSpec) GetCopyStatus() enums.CriImageCacheCopyStatus {
+ if x != nil {
+ return x.CopyStatus
+ }
+ return enums.CriImageCacheCopyStatus(0)
+}
+
// RegistriesConfigSpec describes status of rendered secrets.
type RegistriesConfigSpec struct {
state protoimpl.MessageState
@@ -448,105 +456,111 @@ var file_resource_definitions_cri_cri_proto_rawDesc = []byte{
0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
0x65, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x6e,
0x75, 0x6d, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
- 0x7b, 0x0a, 0x14, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e,
- 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
- 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e,
- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
- 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x69, 0x49, 0x6d,
- 0x61, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
- 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18,
- 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x22, 0xec, 0x03, 0x0a,
- 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69,
- 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x74, 0x0a, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
- 0x79, 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x49, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
- 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69,
- 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69,
- 0x67, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69,
- 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69,
- 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0f, 0x72,
- 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02,
- 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
- 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73,
- 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,
- 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e,
- 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x78,
- 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72,
- 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
- 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e,
- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
- 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
- 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76,
- 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69,
- 0x73, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
- 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
- 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72,
- 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
- 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x12,
- 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66,
- 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x75,
- 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72,
- 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12,
- 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x73, 0x73,
- 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x67, 0x69,
- 0x73, 0x74, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d,
- 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74,
- 0x68, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x64,
- 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x49, 0x64, 0x65, 0x6e,
- 0x74, 0x69, 0x74, 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x01, 0x0a, 0x0e, 0x52, 0x65,
- 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x54, 0x0a, 0x0c,
- 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75,
+ 0xd7, 0x01, 0x0a, 0x14, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73,
+ 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x69, 0x49,
+ 0x6d, 0x61, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+ 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x74, 0x73,
+ 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x5a, 0x0a,
+ 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75,
0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
- 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54, 0x4c, 0x53, 0x43,
- 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54,
- 0x6c, 0x73, 0x12, 0x57, 0x0a, 0x0d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61,
- 0x75, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x61, 0x6c, 0x6f,
- 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e,
- 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,
- 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x72,
- 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa5, 0x01, 0x0a, 0x14,
- 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f,
- 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x65,
- 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f,
- 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12,
- 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69,
- 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6d,
- 0x69, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x61, 0x74,
- 0x68, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x6b, 0x69, 0x70,
- 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
- 0x12, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x6b, 0x69, 0x70, 0x46, 0x61, 0x6c, 0x6c, 0x62,
- 0x61, 0x63, 0x6b, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
- 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x53, 0x0a, 0x13, 0x74, 0x6c, 0x73,
- 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
- 0x50, 0x45, 0x4d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
- 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x74, 0x6c, 0x73,
- 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x14,
- 0x0a, 0x05, 0x74, 0x6c, 0x73, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74,
- 0x6c, 0x73, 0x63, 0x61, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x65,
- 0x63, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x74, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63,
- 0x75, 0x72, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x57, 0x0a,
- 0x12, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53,
- 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52,
- 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x70, 0x0a, 0x26, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x61,
- 0x6c, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x69, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x61,
+ 0x63, 0x68, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x63,
+ 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xec, 0x03, 0x0a, 0x14, 0x52, 0x65,
+ 0x67, 0x69, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70,
+ 0x65, 0x63, 0x12, 0x74, 0x0a, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x6d,
+ 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x74,
+ 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65,
+ 0x67, 0x69, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70,
+ 0x65, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f,
+ 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+ 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0f, 0x72, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63,
+ 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x78, 0x0a, 0x14, 0x52,
+ 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69,
+ 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+ 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
+ 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44,
+ 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e,
+ 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52,
+ 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
+ 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11,
+ 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+ 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x36,
+ 0x0a, 0x17, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x54, 0x0a, 0x0c, 0x72, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x31, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69,
- 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64,
- 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x70, 0x6b,
- 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2f, 0x61, 0x70, 0x69, 0x2f,
- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
- 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66,
+ 0x69, 0x67, 0x52, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54, 0x6c, 0x73, 0x12,
+ 0x57, 0x0a, 0x0d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x75, 0x74, 0x68,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72,
+ 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+ 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa5, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x79, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x67, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x65, 0x6e, 0x64, 0x70,
+ 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x69, 0x72,
+ 0x72, 0x6f, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14,
+ 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f,
+ 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6d, 0x69, 0x72, 0x72,
+ 0x6f, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30,
+ 0x0a, 0x14, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x66, 0x61,
+ 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6d, 0x69,
+ 0x72, 0x72, 0x6f, 0x72, 0x53, 0x6b, 0x69, 0x70, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b,
+ 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54, 0x4c, 0x53,
+ 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x53, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x6c,
+ 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x45, 0x4d,
+ 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
+ 0x74, 0x65, 0x41, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x6c, 0x69,
+ 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74,
+ 0x6c, 0x73, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x63,
+ 0x61, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72,
+ 0x65, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x15, 0x74, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65,
+ 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x57, 0x0a, 0x12, 0x53, 0x65,
+ 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63,
+ 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x42, 0x70, 0x0a, 0x26, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73,
+ 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x72, 0x69, 0x5a, 0x46, 0x67,
+ 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f,
+ 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x2f, 0x63, 0x72, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -573,24 +587,26 @@ var file_resource_definitions_cri_cri_proto_goTypes = []any{
nil, // 7: talos.resource.definitions.cri.RegistriesConfigSpec.RegistryMirrorsEntry
nil, // 8: talos.resource.definitions.cri.RegistriesConfigSpec.RegistryConfigEntry
(enums.CriImageCacheStatus)(0), // 9: talos.resource.definitions.enums.CriImageCacheStatus
- (*common.PEMEncodedCertificateAndKey)(nil), // 10: common.PEMEncodedCertificateAndKey
- (*structpb.Struct)(nil), // 11: google.protobuf.Struct
+ (enums.CriImageCacheCopyStatus)(0), // 10: talos.resource.definitions.enums.CriImageCacheCopyStatus
+ (*common.PEMEncodedCertificateAndKey)(nil), // 11: common.PEMEncodedCertificateAndKey
+ (*structpb.Struct)(nil), // 12: google.protobuf.Struct
}
var file_resource_definitions_cri_cri_proto_depIdxs = []int32{
9, // 0: talos.resource.definitions.cri.ImageCacheConfigSpec.status:type_name -> talos.resource.definitions.enums.CriImageCacheStatus
- 7, // 1: talos.resource.definitions.cri.RegistriesConfigSpec.registry_mirrors:type_name -> talos.resource.definitions.cri.RegistriesConfigSpec.RegistryMirrorsEntry
- 8, // 2: talos.resource.definitions.cri.RegistriesConfigSpec.registry_config:type_name -> talos.resource.definitions.cri.RegistriesConfigSpec.RegistryConfigEntry
- 5, // 3: talos.resource.definitions.cri.RegistryConfig.registry_tls:type_name -> talos.resource.definitions.cri.RegistryTLSConfig
- 2, // 4: talos.resource.definitions.cri.RegistryConfig.registry_auth:type_name -> talos.resource.definitions.cri.RegistryAuthConfig
- 10, // 5: talos.resource.definitions.cri.RegistryTLSConfig.tls_client_identity:type_name -> common.PEMEncodedCertificateAndKey
- 11, // 6: talos.resource.definitions.cri.SeccompProfileSpec.value:type_name -> google.protobuf.Struct
- 4, // 7: talos.resource.definitions.cri.RegistriesConfigSpec.RegistryMirrorsEntry.value:type_name -> talos.resource.definitions.cri.RegistryMirrorConfig
- 3, // 8: talos.resource.definitions.cri.RegistriesConfigSpec.RegistryConfigEntry.value:type_name -> talos.resource.definitions.cri.RegistryConfig
- 9, // [9:9] is the sub-list for method output_type
- 9, // [9:9] is the sub-list for method input_type
- 9, // [9:9] is the sub-list for extension type_name
- 9, // [9:9] is the sub-list for extension extendee
- 0, // [0:9] is the sub-list for field type_name
+ 10, // 1: talos.resource.definitions.cri.ImageCacheConfigSpec.copy_status:type_name -> talos.resource.definitions.enums.CriImageCacheCopyStatus
+ 7, // 2: talos.resource.definitions.cri.RegistriesConfigSpec.registry_mirrors:type_name -> talos.resource.definitions.cri.RegistriesConfigSpec.RegistryMirrorsEntry
+ 8, // 3: talos.resource.definitions.cri.RegistriesConfigSpec.registry_config:type_name -> talos.resource.definitions.cri.RegistriesConfigSpec.RegistryConfigEntry
+ 5, // 4: talos.resource.definitions.cri.RegistryConfig.registry_tls:type_name -> talos.resource.definitions.cri.RegistryTLSConfig
+ 2, // 5: talos.resource.definitions.cri.RegistryConfig.registry_auth:type_name -> talos.resource.definitions.cri.RegistryAuthConfig
+ 11, // 6: talos.resource.definitions.cri.RegistryTLSConfig.tls_client_identity:type_name -> common.PEMEncodedCertificateAndKey
+ 12, // 7: talos.resource.definitions.cri.SeccompProfileSpec.value:type_name -> google.protobuf.Struct
+ 4, // 8: talos.resource.definitions.cri.RegistriesConfigSpec.RegistryMirrorsEntry.value:type_name -> talos.resource.definitions.cri.RegistryMirrorConfig
+ 3, // 9: talos.resource.definitions.cri.RegistriesConfigSpec.RegistryConfigEntry.value:type_name -> talos.resource.definitions.cri.RegistryConfig
+ 10, // [10:10] is the sub-list for method output_type
+ 10, // [10:10] is the sub-list for method input_type
+ 10, // [10:10] is the sub-list for extension type_name
+ 10, // [10:10] is the sub-list for extension extendee
+ 0, // [0:10] is the sub-list for field type_name
}
func init() { file_resource_definitions_cri_cri_proto_init() }
diff --git a/pkg/machinery/api/resource/definitions/cri/cri_vtproto.pb.go b/pkg/machinery/api/resource/definitions/cri/cri_vtproto.pb.go
index 660742fee7..b92191a6a4 100644
--- a/pkg/machinery/api/resource/definitions/cri/cri_vtproto.pb.go
+++ b/pkg/machinery/api/resource/definitions/cri/cri_vtproto.pb.go
@@ -55,6 +55,11 @@ func (m *ImageCacheConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error)
i -= len(m.unknownFields)
copy(dAtA[i:], m.unknownFields)
}
+ if m.CopyStatus != 0 {
+ i = protohelpers.EncodeVarint(dAtA, i, uint64(m.CopyStatus))
+ i--
+ dAtA[i] = 0x18
+ }
if len(m.Roots) > 0 {
for iNdEx := len(m.Roots) - 1; iNdEx >= 0; iNdEx-- {
i -= len(m.Roots[iNdEx])
@@ -462,6 +467,9 @@ func (m *ImageCacheConfigSpec) SizeVT() (n int) {
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
}
+ if m.CopyStatus != 0 {
+ n += 1 + protohelpers.SizeOfVarint(uint64(m.CopyStatus))
+ }
n += len(m.unknownFields)
return n
}
@@ -693,6 +701,25 @@ func (m *ImageCacheConfigSpec) UnmarshalVT(dAtA []byte) error {
}
m.Roots = append(m.Roots, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
+ case 3:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field CopyStatus", wireType)
+ }
+ m.CopyStatus = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protohelpers.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.CopyStatus |= enums.CriImageCacheCopyStatus(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
default:
iNdEx = preIndex
skippy, err := protohelpers.Skip(dAtA[iNdEx:])
diff --git a/pkg/machinery/api/resource/definitions/enums/enums.pb.go b/pkg/machinery/api/resource/definitions/enums/enums.pb.go
index b13787ffc3..ef8b0faf62 100644
--- a/pkg/machinery/api/resource/definitions/enums/enums.pb.go
+++ b/pkg/machinery/api/resource/definitions/enums/enums.pb.go
@@ -2155,6 +2155,59 @@ func (CriImageCacheStatus) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{32}
}
+// CriImageCacheCopyStatus describes image cache copy status type.
+type CriImageCacheCopyStatus int32
+
+const (
+ CriImageCacheCopyStatus_IMAGE_CACHE_COPY_STATUS_UNKNOWN CriImageCacheCopyStatus = 0
+ CriImageCacheCopyStatus_IMAGE_CACHE_COPY_STATUS_SKIPPED CriImageCacheCopyStatus = 1
+ CriImageCacheCopyStatus_IMAGE_CACHE_COPY_STATUS_PENDING CriImageCacheCopyStatus = 2
+ CriImageCacheCopyStatus_IMAGE_CACHE_COPY_STATUS_READY CriImageCacheCopyStatus = 3
+)
+
+// Enum value maps for CriImageCacheCopyStatus.
+var (
+ CriImageCacheCopyStatus_name = map[int32]string{
+ 0: "IMAGE_CACHE_COPY_STATUS_UNKNOWN",
+ 1: "IMAGE_CACHE_COPY_STATUS_SKIPPED",
+ 2: "IMAGE_CACHE_COPY_STATUS_PENDING",
+ 3: "IMAGE_CACHE_COPY_STATUS_READY",
+ }
+ CriImageCacheCopyStatus_value = map[string]int32{
+ "IMAGE_CACHE_COPY_STATUS_UNKNOWN": 0,
+ "IMAGE_CACHE_COPY_STATUS_SKIPPED": 1,
+ "IMAGE_CACHE_COPY_STATUS_PENDING": 2,
+ "IMAGE_CACHE_COPY_STATUS_READY": 3,
+ }
+)
+
+func (x CriImageCacheCopyStatus) Enum() *CriImageCacheCopyStatus {
+ p := new(CriImageCacheCopyStatus)
+ *p = x
+ return p
+}
+
+func (x CriImageCacheCopyStatus) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (CriImageCacheCopyStatus) Descriptor() protoreflect.EnumDescriptor {
+ return file_resource_definitions_enums_enums_proto_enumTypes[33].Descriptor()
+}
+
+func (CriImageCacheCopyStatus) Type() protoreflect.EnumType {
+ return &file_resource_definitions_enums_enums_proto_enumTypes[33]
+}
+
+func (x CriImageCacheCopyStatus) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use CriImageCacheCopyStatus.Descriptor instead.
+func (CriImageCacheCopyStatus) EnumDescriptor() ([]byte, []int) {
+ return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{33}
+}
+
// KubespanPeerState is KubeSpan peer current state.
type KubespanPeerState int32
@@ -2189,11 +2242,11 @@ func (x KubespanPeerState) String() string {
}
func (KubespanPeerState) Descriptor() protoreflect.EnumDescriptor {
- return file_resource_definitions_enums_enums_proto_enumTypes[33].Descriptor()
+ return file_resource_definitions_enums_enums_proto_enumTypes[34].Descriptor()
}
func (KubespanPeerState) Type() protoreflect.EnumType {
- return &file_resource_definitions_enums_enums_proto_enumTypes[33]
+ return &file_resource_definitions_enums_enums_proto_enumTypes[34]
}
func (x KubespanPeerState) Number() protoreflect.EnumNumber {
@@ -2202,7 +2255,7 @@ func (x KubespanPeerState) Number() protoreflect.EnumNumber {
// Deprecated: Use KubespanPeerState.Descriptor instead.
func (KubespanPeerState) EnumDescriptor() ([]byte, []int) {
- return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{33}
+ return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{34}
}
// NetworkConfigLayer describes network configuration layers, with lowest priority first.
@@ -2245,11 +2298,11 @@ func (x NetworkConfigLayer) String() string {
}
func (NetworkConfigLayer) Descriptor() protoreflect.EnumDescriptor {
- return file_resource_definitions_enums_enums_proto_enumTypes[34].Descriptor()
+ return file_resource_definitions_enums_enums_proto_enumTypes[35].Descriptor()
}
func (NetworkConfigLayer) Type() protoreflect.EnumType {
- return &file_resource_definitions_enums_enums_proto_enumTypes[34]
+ return &file_resource_definitions_enums_enums_proto_enumTypes[35]
}
func (x NetworkConfigLayer) Number() protoreflect.EnumNumber {
@@ -2258,7 +2311,7 @@ func (x NetworkConfigLayer) Number() protoreflect.EnumNumber {
// Deprecated: Use NetworkConfigLayer.Descriptor instead.
func (NetworkConfigLayer) EnumDescriptor() ([]byte, []int) {
- return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{34}
+ return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{35}
}
// NetworkOperator enumerates Talos network operators.
@@ -2295,11 +2348,11 @@ func (x NetworkOperator) String() string {
}
func (NetworkOperator) Descriptor() protoreflect.EnumDescriptor {
- return file_resource_definitions_enums_enums_proto_enumTypes[35].Descriptor()
+ return file_resource_definitions_enums_enums_proto_enumTypes[36].Descriptor()
}
func (NetworkOperator) Type() protoreflect.EnumType {
- return &file_resource_definitions_enums_enums_proto_enumTypes[35]
+ return &file_resource_definitions_enums_enums_proto_enumTypes[36]
}
func (x NetworkOperator) Number() protoreflect.EnumNumber {
@@ -2308,7 +2361,7 @@ func (x NetworkOperator) Number() protoreflect.EnumNumber {
// Deprecated: Use NetworkOperator.Descriptor instead.
func (NetworkOperator) EnumDescriptor() ([]byte, []int) {
- return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{35}
+ return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{36}
}
// RuntimeMachineStage describes the stage of the machine boot/run process.
@@ -2363,11 +2416,11 @@ func (x RuntimeMachineStage) String() string {
}
func (RuntimeMachineStage) Descriptor() protoreflect.EnumDescriptor {
- return file_resource_definitions_enums_enums_proto_enumTypes[36].Descriptor()
+ return file_resource_definitions_enums_enums_proto_enumTypes[37].Descriptor()
}
func (RuntimeMachineStage) Type() protoreflect.EnumType {
- return &file_resource_definitions_enums_enums_proto_enumTypes[36]
+ return &file_resource_definitions_enums_enums_proto_enumTypes[37]
}
func (x RuntimeMachineStage) Number() protoreflect.EnumNumber {
@@ -2376,7 +2429,7 @@ func (x RuntimeMachineStage) Number() protoreflect.EnumNumber {
// Deprecated: Use RuntimeMachineStage.Descriptor instead.
func (RuntimeMachineStage) EnumDescriptor() ([]byte, []int) {
- return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{36}
+ return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{37}
}
var File_resource_definitions_enums_enums_proto protoreflect.FileDescriptor
@@ -2797,51 +2850,62 @@ var file_resource_definitions_enums_enums_proto_rawDesc = []byte{
0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10,
0x02, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45,
0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x03, 0x2a,
- 0x53, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x50, 0x65, 0x65, 0x72, 0x53,
- 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x45, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41,
- 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d,
- 0x50, 0x45, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x10, 0x01, 0x12,
- 0x13, 0x0a, 0x0f, 0x50, 0x45, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f,
- 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x88, 0x01, 0x0a, 0x12, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
- 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x0e, 0x43,
- 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12,
- 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x43, 0x4d, 0x44, 0x4c, 0x49, 0x4e,
- 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4c,
- 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x46,
- 0x49, 0x47, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x20, 0x0a,
- 0x1c, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f,
- 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x2a,
- 0x4b, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
- 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x44,
- 0x48, 0x43, 0x50, 0x34, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54,
- 0x4f, 0x52, 0x5f, 0x44, 0x48, 0x43, 0x50, 0x36, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50,
- 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x56, 0x49, 0x50, 0x10, 0x02, 0x2a, 0x9b, 0x02, 0x0a,
- 0x13, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53,
- 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f,
- 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
- 0x19, 0x0a, 0x15, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45,
- 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41,
- 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54,
- 0x41, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x41, 0x43, 0x48,
- 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45,
- 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x41, 0x43, 0x48, 0x49,
- 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47,
- 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54,
- 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12,
- 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45,
- 0x5f, 0x53, 0x48, 0x55, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x06,
+ 0xab, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x69, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68,
+ 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x1f, 0x49,
+ 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x5f,
+ 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
+ 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f,
+ 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, 0x50,
+ 0x50, 0x45, 0x44, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x43,
+ 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,
+ 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4d,
+ 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x53,
+ 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x03, 0x2a, 0x53, 0x0a,
+ 0x11, 0x4b, 0x75, 0x62, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x45, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45,
+ 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x45,
+ 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x13, 0x0a,
+ 0x0f, 0x50, 0x45, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f, 0x57, 0x4e,
+ 0x10, 0x02, 0x2a, 0x88, 0x01, 0x0a, 0x12, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e,
+ 0x46, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a,
+ 0x0e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x43, 0x4d, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x10,
+ 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x50, 0x4c, 0x41, 0x54,
+ 0x46, 0x4f, 0x52, 0x4d, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47,
+ 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x20, 0x0a, 0x1c, 0x43,
+ 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x43, 0x4f,
+ 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x2a, 0x4b, 0x0a,
+ 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,
+ 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x44, 0x48, 0x43,
+ 0x50, 0x34, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52,
+ 0x5f, 0x44, 0x48, 0x43, 0x50, 0x36, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52,
+ 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x56, 0x49, 0x50, 0x10, 0x02, 0x2a, 0x9b, 0x02, 0x0a, 0x13, 0x52,
+ 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61,
+ 0x67, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54,
+ 0x41, 0x47, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a,
+ 0x15, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x42,
+ 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x43, 0x48,
+ 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c,
+ 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e,
+ 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41,
+ 0x4e, 0x43, 0x45, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45,
+ 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04,
0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47,
- 0x45, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x1b, 0x0a,
- 0x17, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x55,
- 0x50, 0x47, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x42, 0x74, 0x0a, 0x28, 0x64, 0x65,
- 0x76, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
- 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
- 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61,
- 0x6c, 0x6f, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72,
- 0x79, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x64,
- 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73,
- 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x45, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x1f, 0x0a,
+ 0x1b, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x53,
+ 0x48, 0x55, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x06, 0x12, 0x1b,
+ 0x0a, 0x17, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f,
+ 0x52, 0x45, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, 0x4d,
+ 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x55, 0x50, 0x47,
+ 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x42, 0x74, 0x0a, 0x28, 0x64, 0x65, 0x76, 0x2e,
+ 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65,
+ 0x6e, 0x75, 0x6d, 0x73, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x6c, 0x6f,
+ 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2f,
+ 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x66,
+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -2856,7 +2920,7 @@ func file_resource_definitions_enums_enums_proto_rawDescGZIP() []byte {
return file_resource_definitions_enums_enums_proto_rawDescData
}
-var file_resource_definitions_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 37)
+var file_resource_definitions_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 38)
var file_resource_definitions_enums_enums_proto_goTypes = []any{
(MachineType)(0), // 0: talos.resource.definitions.enums.MachineType
(NethelpersAddressFlag)(0), // 1: talos.resource.definitions.enums.NethelpersAddressFlag
@@ -2891,10 +2955,11 @@ var file_resource_definitions_enums_enums_proto_goTypes = []any{
(BlockVolumePhase)(0), // 30: talos.resource.definitions.enums.BlockVolumePhase
(BlockVolumeType)(0), // 31: talos.resource.definitions.enums.BlockVolumeType
(CriImageCacheStatus)(0), // 32: talos.resource.definitions.enums.CriImageCacheStatus
- (KubespanPeerState)(0), // 33: talos.resource.definitions.enums.KubespanPeerState
- (NetworkConfigLayer)(0), // 34: talos.resource.definitions.enums.NetworkConfigLayer
- (NetworkOperator)(0), // 35: talos.resource.definitions.enums.NetworkOperator
- (RuntimeMachineStage)(0), // 36: talos.resource.definitions.enums.RuntimeMachineStage
+ (CriImageCacheCopyStatus)(0), // 33: talos.resource.definitions.enums.CriImageCacheCopyStatus
+ (KubespanPeerState)(0), // 34: talos.resource.definitions.enums.KubespanPeerState
+ (NetworkConfigLayer)(0), // 35: talos.resource.definitions.enums.NetworkConfigLayer
+ (NetworkOperator)(0), // 36: talos.resource.definitions.enums.NetworkOperator
+ (RuntimeMachineStage)(0), // 37: talos.resource.definitions.enums.RuntimeMachineStage
}
var file_resource_definitions_enums_enums_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
@@ -2914,7 +2979,7 @@ func file_resource_definitions_enums_enums_proto_init() {
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_resource_definitions_enums_enums_proto_rawDesc,
- NumEnums: 37,
+ NumEnums: 38,
NumMessages: 0,
NumExtensions: 0,
NumServices: 0,
diff --git a/pkg/machinery/resources/cri/cri.go b/pkg/machinery/resources/cri/cri.go
index 5fe06b294b..2bf57a470a 100644
--- a/pkg/machinery/resources/cri/cri.go
+++ b/pkg/machinery/resources/cri/cri.go
@@ -18,7 +18,7 @@ import (
//go:generate deep-copy -type RegistriesConfigSpec -type ImageCacheConfigSpec -type SeccompProfileSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go .
-//go:generate enumer -type=ImageCacheStatus -linecomment -text
+//go:generate enumer -type=ImageCacheStatus -type=ImageCacheCopyStatus -linecomment -text
// NamespaceName contains resources related to stats.
const NamespaceName resource.Namespace = "cri"
@@ -53,3 +53,22 @@ func WaitForImageCache(ctx context.Context, st state.State) error {
return err
}
+
+// WaitForImageCacheCopy waits for the image cache copy to be done (or skipped).
+func WaitForImageCacheCopy(ctx context.Context, st state.State) error {
+ _, err := st.WatchFor(ctx, NewImageCacheConfig().Metadata(),
+ state.WithEventTypes(state.Created, state.Updated),
+ state.WithCondition(func(r resource.Resource) (bool, error) {
+ imageCacheConfig, ok := r.(*ImageCacheConfig)
+ if !ok {
+ return false, fmt.Errorf("unexpected resource type: %T", r)
+ }
+
+ s := imageCacheConfig.TypedSpec().CopyStatus
+
+ return s == ImageCacheCopyStatusReady || s == ImageCacheCopyStatusSkipped, nil
+ }),
+ )
+
+ return err
+}
diff --git a/pkg/machinery/resources/cri/image_cache_config.go b/pkg/machinery/resources/cri/image_cache_config.go
index 46913e8fd3..2e96435427 100644
--- a/pkg/machinery/resources/cri/image_cache_config.go
+++ b/pkg/machinery/resources/cri/image_cache_config.go
@@ -26,8 +26,9 @@ const ImageCacheConfigID = "image-cache"
//
//gotagsrewrite:gen
type ImageCacheConfigSpec struct {
- Status ImageCacheStatus `yaml:"status" protobuf:"1"`
- Roots []string `yaml:"roots" protobuf:"2"`
+ Status ImageCacheStatus `yaml:"status" protobuf:"1"`
+ CopyStatus ImageCacheCopyStatus `yaml:"copyStatus" protobuf:"3"`
+ Roots []string `yaml:"roots" protobuf:"2"`
}
// NewImageCacheConfig creates new ImageCacheConfig object.
@@ -52,6 +53,10 @@ func (ImageCacheConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpe
Name: "Status",
JSONPath: "{.status}",
},
+ {
+ Name: "CopyStatus",
+ JSONPath: "{.copyStatus}",
+ },
{
Name: "Roots",
JSONPath: "{.roots}",
diff --git a/pkg/machinery/resources/cri/imagecachecopystatus_enumer.go b/pkg/machinery/resources/cri/imagecachecopystatus_enumer.go
new file mode 100644
index 0000000000..5eedd9f88d
--- /dev/null
+++ b/pkg/machinery/resources/cri/imagecachecopystatus_enumer.go
@@ -0,0 +1,98 @@
+// Code generated by "enumer -type=ImageCacheStatus -type=ImageCacheCopyStatus -linecomment -text"; DO NOT EDIT.
+
+package cri
+
+import (
+ "fmt"
+ "strings"
+)
+
+const _ImageCacheCopyStatusName = "unknownskippedcopyingready"
+
+var _ImageCacheCopyStatusIndex = [...]uint8{0, 7, 14, 21, 26}
+
+const _ImageCacheCopyStatusLowerName = "unknownskippedcopyingready"
+
+func (i ImageCacheCopyStatus) String() string {
+ if i < 0 || i >= ImageCacheCopyStatus(len(_ImageCacheCopyStatusIndex)-1) {
+ return fmt.Sprintf("ImageCacheCopyStatus(%d)", i)
+ }
+ return _ImageCacheCopyStatusName[_ImageCacheCopyStatusIndex[i]:_ImageCacheCopyStatusIndex[i+1]]
+}
+
+// An "invalid array index" compiler error signifies that the constant values have changed.
+// Re-run the stringer command to generate them again.
+func _ImageCacheCopyStatusNoOp() {
+ var x [1]struct{}
+ _ = x[ImageCacheCopyStatusUnknown-(0)]
+ _ = x[ImageCacheCopyStatusSkipped-(1)]
+ _ = x[ImageCacheCopyStatusPending-(2)]
+ _ = x[ImageCacheCopyStatusReady-(3)]
+}
+
+var _ImageCacheCopyStatusValues = []ImageCacheCopyStatus{ImageCacheCopyStatusUnknown, ImageCacheCopyStatusSkipped, ImageCacheCopyStatusPending, ImageCacheCopyStatusReady}
+
+var _ImageCacheCopyStatusNameToValueMap = map[string]ImageCacheCopyStatus{
+ _ImageCacheCopyStatusName[0:7]: ImageCacheCopyStatusUnknown,
+ _ImageCacheCopyStatusLowerName[0:7]: ImageCacheCopyStatusUnknown,
+ _ImageCacheCopyStatusName[7:14]: ImageCacheCopyStatusSkipped,
+ _ImageCacheCopyStatusLowerName[7:14]: ImageCacheCopyStatusSkipped,
+ _ImageCacheCopyStatusName[14:21]: ImageCacheCopyStatusPending,
+ _ImageCacheCopyStatusLowerName[14:21]: ImageCacheCopyStatusPending,
+ _ImageCacheCopyStatusName[21:26]: ImageCacheCopyStatusReady,
+ _ImageCacheCopyStatusLowerName[21:26]: ImageCacheCopyStatusReady,
+}
+
+var _ImageCacheCopyStatusNames = []string{
+ _ImageCacheCopyStatusName[0:7],
+ _ImageCacheCopyStatusName[7:14],
+ _ImageCacheCopyStatusName[14:21],
+ _ImageCacheCopyStatusName[21:26],
+}
+
+// ImageCacheCopyStatusString retrieves an enum value from the enum constants string name.
+// Throws an error if the param is not part of the enum.
+func ImageCacheCopyStatusString(s string) (ImageCacheCopyStatus, error) {
+ if val, ok := _ImageCacheCopyStatusNameToValueMap[s]; ok {
+ return val, nil
+ }
+
+ if val, ok := _ImageCacheCopyStatusNameToValueMap[strings.ToLower(s)]; ok {
+ return val, nil
+ }
+ return 0, fmt.Errorf("%s does not belong to ImageCacheCopyStatus values", s)
+}
+
+// ImageCacheCopyStatusValues returns all values of the enum
+func ImageCacheCopyStatusValues() []ImageCacheCopyStatus {
+ return _ImageCacheCopyStatusValues
+}
+
+// ImageCacheCopyStatusStrings returns a slice of all String values of the enum
+func ImageCacheCopyStatusStrings() []string {
+ strs := make([]string, len(_ImageCacheCopyStatusNames))
+ copy(strs, _ImageCacheCopyStatusNames)
+ return strs
+}
+
+// IsAImageCacheCopyStatus returns "true" if the value is listed in the enum definition. "false" otherwise
+func (i ImageCacheCopyStatus) IsAImageCacheCopyStatus() bool {
+ for _, v := range _ImageCacheCopyStatusValues {
+ if i == v {
+ return true
+ }
+ }
+ return false
+}
+
+// MarshalText implements the encoding.TextMarshaler interface for ImageCacheCopyStatus
+func (i ImageCacheCopyStatus) MarshalText() ([]byte, error) {
+ return []byte(i.String()), nil
+}
+
+// UnmarshalText implements the encoding.TextUnmarshaler interface for ImageCacheCopyStatus
+func (i *ImageCacheCopyStatus) UnmarshalText(text []byte) error {
+ var err error
+ *i, err = ImageCacheCopyStatusString(string(text))
+ return err
+}
diff --git a/pkg/machinery/resources/cri/imagecachestatus.go b/pkg/machinery/resources/cri/imagecachestatus.go
index 28dd32987a..42188b08cc 100644
--- a/pkg/machinery/resources/cri/imagecachestatus.go
+++ b/pkg/machinery/resources/cri/imagecachestatus.go
@@ -16,3 +16,16 @@ const (
ImageCacheStatusPreparing // preparing
ImageCacheStatusReady // ready
)
+
+// ImageCacheCopyStatus describes image cache copy status type.
+type ImageCacheCopyStatus int
+
+// ImageCacheCopyStatus values.
+//
+//structprotogen:gen_enum
+const (
+ ImageCacheCopyStatusUnknown ImageCacheCopyStatus = iota // unknown
+ ImageCacheCopyStatusSkipped // skipped
+ ImageCacheCopyStatusPending // copying
+ ImageCacheCopyStatusReady // ready
+)
diff --git a/website/content/v1.9/reference/api.md b/website/content/v1.9/reference/api.md
index 6a11d0776a..64d9b8fe48 100644
--- a/website/content/v1.9/reference/api.md
+++ b/website/content/v1.9/reference/api.md
@@ -71,6 +71,7 @@ description: Talos gRPC API reference.
- [BlockFilesystemType](#talos.resource.definitions.enums.BlockFilesystemType)
- [BlockVolumePhase](#talos.resource.definitions.enums.BlockVolumePhase)
- [BlockVolumeType](#talos.resource.definitions.enums.BlockVolumeType)
+ - [CriImageCacheCopyStatus](#talos.resource.definitions.enums.CriImageCacheCopyStatus)
- [CriImageCacheStatus](#talos.resource.definitions.enums.CriImageCacheStatus)
- [KubespanPeerState](#talos.resource.definitions.enums.KubespanPeerState)
- [MachineType](#talos.resource.definitions.enums.MachineType)
@@ -1310,6 +1311,7 @@ ImageCacheConfigSpec represents the ImageCacheConfig.
| ----- | ---- | ----- | ----------- |
| status | [talos.resource.definitions.enums.CriImageCacheStatus](#talos.resource.definitions.enums.CriImageCacheStatus) | | |
| roots | [string](#string) | repeated | |
+| copy_status | [talos.resource.definitions.enums.CriImageCacheCopyStatus](#talos.resource.definitions.enums.CriImageCacheCopyStatus) | | |
@@ -1538,6 +1540,20 @@ BlockVolumeType describes volume type.
+
+
+### CriImageCacheCopyStatus
+CriImageCacheCopyStatus describes image cache copy status type.
+
+| Name | Number | Description |
+| ---- | ------ | ----------- |
+| IMAGE_CACHE_COPY_STATUS_UNKNOWN | 0 | |
+| IMAGE_CACHE_COPY_STATUS_SKIPPED | 1 | |
+| IMAGE_CACHE_COPY_STATUS_PENDING | 2 | |
+| IMAGE_CACHE_COPY_STATUS_READY | 3 | |
+
+
+
### CriImageCacheStatus
diff --git a/website/content/v1.9/talos-guides/configuration/disk-management.md b/website/content/v1.9/talos-guides/configuration/disk-management.md
index 3ad59dcc6d..b45636cc99 100644
--- a/website/content/v1.9/talos-guides/configuration/disk-management.md
+++ b/website/content/v1.9/talos-guides/configuration/disk-management.md
@@ -190,7 +190,7 @@ Each volume goes through different phases during its lifecycle:
## Machine Configuration
-> Note: In Talos Linux 1.8, only `EPHEMERAL` system volume configuration can be managed through the machine configuration.
+> Note: Only `EPHEMERAL` and `IMAGECACHE` system volume configuration can be managed through the machine configuration.
>
> Note: The volume configuration in the machine configuration is only applied when the volume has not been provisioned yet.
> So applying changes after the initial provisioning will not have any effect.
diff --git a/website/content/v1.9/talos-guides/configuration/image-cache.md b/website/content/v1.9/talos-guides/configuration/image-cache.md
new file mode 100644
index 0000000000..0e8646b019
--- /dev/null
+++ b/website/content/v1.9/talos-guides/configuration/image-cache.md
@@ -0,0 +1,131 @@
+---
+title: "Image Cache"
+description: "How to enable and configure Talos image cache feature."
+---
+
+Talos Image Cache feature allows to provide container images to the nodes without the need to pull them from the Internet.
+This feature is useful in environments with limited or no Internet access.
+
+Image Cache is local to the machine, and automatically managed by Talos if enabled.
+
+## Preparing Image Cache
+
+First, build a list of image references that need to be cached.
+The `talosctl images default` might be used as a starting point, but it should be customized to include additional images (e.g. custom CNI, workload images, etc.)
+
+```bash
+talosctl images default > images.txt
+cat extra-images.txt >> images.txt
+```
+
+Next, prepare an OCI image which contains all cached images:
+
+```bash
+cat images.txt | talosctl images cache-create --image-cache-path ./image-cache.oci --images=-
+```
+
+> Note: The `cache-create` supports a `--layer-cache` flag to additionally cache the pulled images layers on the filesystem.
+> This is useful to speed up repeated calls for `cache-create` with the same images.
+
+The OCI image cache directory might be used directly (`./image-cache.oci`) or pushed itself to a container registry of your choice (e.g. with `crane push`).
+
+## Building Boot Assets
+
+The image cache is provided to Talos via the boot assets.
+There are two supported boot asset types for the Image Cache: ISO and disk image.
+
+### ISO
+
+In case of ISO, the image cache is bundled with a Talos ISO image, it will be available for the initial install and (if configured) copied to the
+disk during the installation process.
+
+The ISO image can built with the [imager]({{< relref "../install/boot-assets#imager" >}}) by passing an additional `--image-cache` flag:
+
+```bash
+mkdir -p _out/
+docker run --rm -t -v $PWD/_out:/secureboot:ro -v $PWD/_out:/out -v /dev:/dev --privileged ghcr.io/siderolabs/imager:{{< release >}} iso --image-cache ./image-cache.oci
+```
+
+> Note: If the image cache was pushed to a container registry, the `--image-cache` flag should point to the image reference.
+> SecureBoot ISO is supported as well.
+
+### Disk Image
+
+In case of disk image, the image cache is included in the disk image itself, and on boot it would be used immediately by the Talos.
+
+The disk image can be built with the [imager]({{< relref "../install/boot-assets#imager" >}}) by passing an additional `--image-cache` flag:
+
+```bash
+mkdir -p _out/
+docker run --rm -t -v $PWD/_out:/secureboot:ro -v $PWD/_out:/out -v /dev:/dev --privileged ghcr.io/siderolabs/imager:{{< release >}} metal --image-cache ./image-cache.tar
+```
+
+> Note: If the image cache was pushed to a container registry, the `--image-cache` flag should point to the image reference.
+
+In case of a disk image, the `IMAGECACHE` partition will occupy all the disk image space (except for the mandatory boot partitions), so the disk image size might need to be adjusted
+accordingly with `--image-disk-size` flag, e.g. `--image-disk-size=4GiB`.
+On boot, Talos will expand the disk image to the full disk size.
+
+## Configuration
+
+The image cache feature (for security reasons) should be explicitly enabled in the Talos configuration:
+
+```yaml
+machine:
+ features:
+ imageCache:
+ localEnabled: true
+```
+
+Once enabled, Talos Linux will automatically look for the image cache contents either on the disk or in the ISO image.
+
+If the image cache is bundled with the ISO image, the disk volume for the image cache should be configured in the Talos configuration to copy the image cache to the disk during the installation process:
+
+```yaml
+apiVersion: v1alpha1
+kind: VolumeConfig
+name: IMAGECACHE
+provisioning:
+ diskSelector:
+ match: 'system_disk'
+ minSize: 2GB
+ maxSize: 2GB
+```
+
+In this example, image cache volume is provisioned on the system disk with a fixed size of 2GB.
+The size of the volume should be adjusted to fit the image cache.
+
+If the disk image is used, the `IMAGECACHE` volume doesn't need to be configured, as the image cache volume is already present in the disk image.
+
+See [disk management]({{< relref "./disk-management#machine-configuration" >}}) for more information on volume configuration.
+
+## Troubleshooting
+
+When the image cache is enabled, Talos will block on boot waiting for the image cache to be available:
+
+```text
+task install (1/1): waiting for the image cache
+```
+
+After the initial install from an ISO, the image cache will be copied to the disk and will be available for the subsequent boots:
+
+```text
+task install (1/1): waiting for the image cache copy
+copying image cache {"component": "controller-runtime", "controller": "cri.ImageCacheConfigController", "source": "/system/imagecache/iso/imagecache", "target": "/system/imagecache/disk"}
+image cache copied {"component": "controller-runtime", "controller": "cri.ImageCacheConfigController", "size": "414 MiB"}
+```
+
+The current status of the image cache can be checked via the `ImageCacheConfig` resource:
+
+```yaml
+# talosctl get imagecacheconfig -o yaml
+spec:
+ status: ready
+ copyStatus: ready
+ roots:
+ - /system/imagecache/disk
+ - /system/imagecache/iso/imagecache
+```
+
+The `status` field indicates the readiness of the image cache, and the `copyStatus` field indicates the readiness of the image cache copy.
+The `roots` field contains the paths to the image cache contents, in this example both on-disk and ISO caches are available.
diff --git a/website/content/v1.9/talos-guides/install/boot-assets.md b/website/content/v1.9/talos-guides/install/boot-assets.md
index e0a88bfe2d..dda3e5b9f4 100644
--- a/website/content/v1.9/talos-guides/install/boot-assets.md
+++ b/website/content/v1.9/talos-guides/install/boot-assets.md
@@ -221,6 +221,7 @@ The base profile can be customized with the additional flags to the imager:
Default kernel arg can be removed by prefixing the argument with a `-`.
For example `-console` removes all `console=` arguments, whereas `-console=tty0` removes the `console=tty0` default argument.
* `--system-extension-image` allows to install a system extension into the image
+* `--image-cache` allows to use a [local image cache]({{< relref "../configuration/image-cache" >}})
### Extension Image Reference