diff --git a/api/resource/definitions/k8s/k8s.proto b/api/resource/definitions/k8s/k8s.proto index 57e9acbb5..a31ebd8e3 100755 --- a/api/resource/definitions/k8s/k8s.proto +++ b/api/resource/definitions/k8s/k8s.proto @@ -171,6 +171,11 @@ message KubeletConfigSpec { map extra_args = 15; } +// KubeletKubeconfigSpec describes the current kubelet kubeconfig file. +message KubeletKubeconfigSpec { + string hash = 1; +} + // KubeletSpecSpec holds the source of kubelet configuration. message KubeletSpecSpec { string image = 1; diff --git a/internal/app/machined/pkg/controllers/k8s/endpoint.go b/internal/app/machined/pkg/controllers/k8s/endpoint.go index 600386ee7..bc1be24df 100644 --- a/internal/app/machined/pkg/controllers/k8s/endpoint.go +++ b/internal/app/machined/pkg/controllers/k8s/endpoint.go @@ -105,19 +105,29 @@ func (ctrl *EndpointController) Run(ctx context.Context, r controller.Runtime, l } func (ctrl *EndpointController) watchEndpointsOnWorker(ctx context.Context, r controller.Runtime, logger *zap.Logger) error { + if err := r.UpdateInputs([]controller.Input{ + { + Namespace: config.NamespaceName, + Type: config.MachineTypeType, + ID: optional.Some(config.MachineTypeID), + Kind: controller.InputWeak, + }, + { + Namespace: k8s.NamespaceName, + Type: k8s.KubeletKubeconfigType, + ID: optional.Some(k8s.KubeletKubeconfigID), + Kind: controller.InputWeak, + }, + }); err != nil { + return err + } + logger.Debug("waiting for kubelet client config", zap.String("file", constants.KubeletKubeconfig)) if err := conditions.WaitForKubeconfigReady(constants.KubeletKubeconfig).Wait(ctx); err != nil { return err } - client, err := kubernetes.NewClientFromKubeletKubeconfig() - if err != nil { - return fmt.Errorf("error building Kubernetes client: %w", err) - } - - defer client.Close() //nolint:errcheck - r.QueueReconcile() for { @@ -127,7 +137,22 @@ func (ctrl *EndpointController) watchEndpointsOnWorker(ctx context.Context, r co return nil } - if err = ctrl.watchKubernetesEndpointSlices(ctx, r, logger, client); err != nil { + // closure to capture the deferred close on client + watch := func() error { + client, err := kubernetes.NewClientFromKubeletKubeconfig() + if err != nil { + return fmt.Errorf("error building Kubernetes client: %w", err) + } + + defer client.Close() //nolint:errcheck + + if err = ctrl.watchKubernetesEndpointSlices(ctx, r, logger, client); err != nil { + return err + } + + return nil + } + if err := watch(); err != nil { return err } } diff --git a/internal/app/machined/pkg/controllers/k8s/internal/nodewatch/nodewatch.go b/internal/app/machined/pkg/controllers/k8s/internal/nodewatch/nodewatch.go index b2681ec85..fe5b038ac 100644 --- a/internal/app/machined/pkg/controllers/k8s/internal/nodewatch/nodewatch.go +++ b/internal/app/machined/pkg/controllers/k8s/internal/nodewatch/nodewatch.go @@ -8,6 +8,7 @@ package nodewatch import ( "context" "fmt" + "time" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" @@ -21,6 +22,11 @@ import ( "github.com/siderolabs/talos/pkg/machinery/constants" ) +// syncTickInterval is how often a "still waiting for initial sync" error is reported to the caller +// while the informer hasn't yet completed its initial list. Each tick increments the caller's +// error counter; once the caller's threshold is reached, the watcher is torn down and rebuilt. +const syncTickInterval = 10 * time.Second + // NodeWatcher defines a NodeWatcher-based node watcher. type NodeWatcher struct { client *kubernetes.Client @@ -48,6 +54,8 @@ func (r *NodeWatcher) Get() (*corev1.Node, error) { } // Watch starts watching Node state and notifies on updates via notify channel. +// +//nolint:gocyclo func (r *NodeWatcher) Watch(ctx context.Context, logger *zap.Logger) (<-chan struct{}, <-chan error, func(), error) { logger.Debug("starting node watcher", zap.String("nodename", r.nodename)) @@ -92,11 +100,16 @@ func (r *NodeWatcher) Watch(ctx context.Context, logger *zap.Logger) (<-chan str informerFactory.Start(ctx.Done()) + syncCtx, syncCancel := context.WithCancel(ctx) + go func() { logger.Debug("waiting for node cache sync") result := informerFactory.WaitForCacheSync(ctx.Done()) + // stop the ticker goroutine below as soon as sync completes (or ctx is done) + syncCancel() + var synced bool // result should contain a single entry @@ -112,5 +125,28 @@ func (r *NodeWatcher) Watch(ctx context.Context, logger *zap.Logger) (<-chan str } }() + // While the informer is still performing its initial list/sync, periodically + // surface a timeout error to the caller's watchErrCh. client-go's reflector + // silently retries connection-refused errors during the initial list, so the + // WatchErrorHandler never fires in that scenario. Pushing ticks here lets the + // caller apply its own threshold and restart the watcher with a fresh client. + go func() { + ticker := time.NewTicker(syncTickInterval) + defer ticker.Stop() + + for { + select { + case <-syncCtx.Done(): + return + case <-ticker.C: + select { + case <-syncCtx.Done(): + return + case watchErrCh <- fmt.Errorf("node cache: no sync for %s", syncTickInterval): + } + } + } + }() + return notifyCh, watchErrCh, informerFactory.Shutdown, nil } diff --git a/internal/app/machined/pkg/controllers/k8s/kubelet_kubeconfig.go b/internal/app/machined/pkg/controllers/k8s/kubelet_kubeconfig.go new file mode 100644 index 000000000..e84971cad --- /dev/null +++ b/internal/app/machined/pkg/controllers/k8s/kubelet_kubeconfig.go @@ -0,0 +1,175 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package k8s + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "time" + + "github.com/cosi-project/runtime/pkg/controller" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/fsnotify/fsnotify" + "go.uber.org/zap" + + "github.com/siderolabs/talos/pkg/machinery/constants" + "github.com/siderolabs/talos/pkg/machinery/resources/k8s" +) + +// kubeletKubeconfigPollInterval is the maximum interval between kubelet kubeconfig +// file reads when fsnotify events are not seen. It acts as a safety net against +// missed inotify events and also covers the startup window before the kubeconfig +// directory exists. +const kubeletKubeconfigPollInterval = 30 * time.Second + +// KubeletKubeconfigController watches the kubelet kubeconfig file on disk and +// exposes its content hash via the [k8s.KubeletKubeconfig] resource. Consumers +// (e.g. [NodeStatusController]) rebuild their Kubernetes clients whenever the +// hash changes, which is how we detect that a stale endpoint baked into an +// existing client should be discarded. +type KubeletKubeconfigController struct { + // Path is the on-disk location of the kubelet kubeconfig. Defaults to + // [constants.KubeletKubeconfig] when empty; overridable for tests. + Path string +} + +func (ctrl *KubeletKubeconfigController) path() string { + if ctrl.Path != "" { + return ctrl.Path + } + + return constants.KubeletKubeconfig +} + +// Name implements controller.Controller interface. +func (ctrl *KubeletKubeconfigController) Name() string { + return "k8s.KubeletKubeconfigController" +} + +// Inputs implements controller.Controller interface. +func (ctrl *KubeletKubeconfigController) Inputs() []controller.Input { + return nil +} + +// Outputs implements controller.Controller interface. +func (ctrl *KubeletKubeconfigController) Outputs() []controller.Output { + return []controller.Output{ + { + Type: k8s.KubeletKubeconfigType, + Kind: controller.OutputExclusive, + }, + } +} + +// Run implements controller.Controller interface. +// +//nolint:gocyclo +func (ctrl *KubeletKubeconfigController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) error { + watcher, err := fsnotify.NewWatcher() + if err != nil { + return fmt.Errorf("failed to create fsnotify watcher: %w", err) + } + + defer watcher.Close() //nolint:errcheck + + kubeconfigDir := filepath.Dir(ctrl.path()) + watchedDir := false + + // Forward fsnotify events and errors into the controller loop via QueueReconcile. + go func() { + for { + select { + case <-ctx.Done(): + return + case event, ok := <-watcher.Events: + if !ok { + return + } + + if filepath.Clean(event.Name) == ctrl.path() { + r.QueueReconcile() + } + case werr, ok := <-watcher.Errors: + if !ok { + return + } + + logger.Warn("fsnotify error on kubelet kubeconfig", zap.Error(werr)) + } + } + }() + + for { + select { + case <-ctx.Done(): + return nil + case <-r.EventCh(): + case <-time.After(kubeletKubeconfigPollInterval): + } + + if !watchedDir { + if _, statErr := os.Stat(kubeconfigDir); statErr == nil { + if addErr := watcher.Add(kubeconfigDir); addErr != nil { + return fmt.Errorf("failed to add %q to fsnotify watcher: %w", kubeconfigDir, addErr) + } + + watchedDir = true + } + } + + r.StartTrackingOutputs() + + hash, err := hashKubeletKubeconfig(ctrl.path()) + if err != nil { + return fmt.Errorf("failed to hash kubelet kubeconfig: %w", err) + } + + if hash != "" { + if err = safe.WriterModify(ctx, r, + k8s.NewKubeletKubeconfig(k8s.NamespaceName, k8s.KubeletKubeconfigID), + func(res *k8s.KubeletKubeconfig) error { + res.TypedSpec().Hash = hash + + return nil + }, + ); err != nil { + return fmt.Errorf("failed to update KubeletKubeconfig resource: %w", err) + } + } + + if err := safe.CleanupOutputs[*k8s.KubeletKubeconfig](ctx, r); err != nil { + return fmt.Errorf("failed to cleanup KubeletKubeconfig resource: %w", err) + } + } +} + +// hashKubeletKubeconfig returns the hex-encoded SHA-256 hash of the file at the +// given path. If the file does not exist, it returns an empty string and nil +// error. +func hashKubeletKubeconfig(path string) (string, error) { + f, err := os.Open(path) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return "", nil + } + + return "", err + } + + defer f.Close() //nolint:errcheck + + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + return "", err + } + + return hex.EncodeToString(h.Sum(nil)), nil +} diff --git a/internal/app/machined/pkg/controllers/k8s/kubelet_kubeconfig_test.go b/internal/app/machined/pkg/controllers/k8s/kubelet_kubeconfig_test.go new file mode 100644 index 000000000..427fb0de7 --- /dev/null +++ b/internal/app/machined/pkg/controllers/k8s/kubelet_kubeconfig_test.go @@ -0,0 +1,102 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package k8s_test + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "os" + "path/filepath" + "slices" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + + "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/ctest" + k8sctrl "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/k8s" + "github.com/siderolabs/talos/pkg/machinery/resources/k8s" +) + +type KubeletKubeconfigSuite struct { + ctest.DefaultSuite + + kubeconfigPath string +} + +func TestKubeletKubeconfigSuite(t *testing.T) { + t.Parallel() + + dir := t.TempDir() + path := filepath.Join(dir, "kubeconfig-kubelet") + + s := &KubeletKubeconfigSuite{ + kubeconfigPath: path, + } + + s.DefaultSuite = ctest.DefaultSuite{ + Timeout: 10 * time.Second, + AfterSetup: func(ds *ctest.DefaultSuite) { + // Reset filesystem state so tests don't leak into each other. + if err := os.Remove(path); err != nil && !errors.Is(err, os.ErrNotExist) { + ds.Require().NoError(err) + } + + ds.Require().NoError(ds.Runtime().RegisterController(&k8sctrl.KubeletKubeconfigController{ + Path: path, + })) + }, + } + + suite.Run(t, s) +} + +func hashOf(data []byte) string { + sum := sha256.Sum256(data) + + return hex.EncodeToString(sum[:]) +} + +func (suite *KubeletKubeconfigSuite) writeKubeconfig(data []byte) { + suite.T().Helper() + + suite.Require().NoError(os.WriteFile(suite.kubeconfigPath, data, 0o600)) +} + +func (suite *KubeletKubeconfigSuite) TestMissingFileNoResource() { + ctest.AssertNoResource[*k8s.KubeletKubeconfig](suite, k8s.KubeletKubeconfigID) +} + +func (suite *KubeletKubeconfigSuite) TestCreateUpdateDelete() { + initial := []byte("apiVersion: v1\nkind: Config\nclusters: []\n") + + suite.writeKubeconfig(initial) + + ctest.AssertResource( + suite, + k8s.KubeletKubeconfigID, + func(res *k8s.KubeletKubeconfig, assert *assert.Assertions) { + assert.Equal(hashOf(initial), res.TypedSpec().Hash) + }, + ) + + updated := slices.Concat(initial, []byte("users: []\n")) + + suite.writeKubeconfig(updated) + + ctest.AssertResource( + suite, + k8s.KubeletKubeconfigID, + func(res *k8s.KubeletKubeconfig, assert *assert.Assertions) { + assert.Equal(hashOf(updated), res.TypedSpec().Hash) + }, + ) + + suite.Require().NoError(os.Remove(suite.kubeconfigPath)) + + ctest.AssertNoResource[*k8s.KubeletKubeconfig](suite, k8s.KubeletKubeconfigID) +} diff --git a/internal/app/machined/pkg/controllers/k8s/node_status.go b/internal/app/machined/pkg/controllers/k8s/node_status.go index 32106cf3d..cdcadd582 100644 --- a/internal/app/machined/pkg/controllers/k8s/node_status.go +++ b/internal/app/machined/pkg/controllers/k8s/node_status.go @@ -45,6 +45,12 @@ func (ctrl *NodeStatusController) Inputs() []controller.Input { ID: optional.Some(k8s.NodenameID), Kind: controller.InputWeak, }, + { + Namespace: k8s.NamespaceName, + Type: k8s.KubeletKubeconfigType, + ID: optional.Some(k8s.KubeletKubeconfigID), + Kind: controller.InputWeak, + }, } } @@ -63,14 +69,15 @@ func (ctrl *NodeStatusController) Outputs() []controller.Output { //nolint:gocyclo,cyclop func (ctrl *NodeStatusController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) error { var ( - kubernetesClient *kubernetes.Client - nodewatcher *nodewatch.NodeWatcher - watchCtxCancel context.CancelFunc - notifyCh <-chan struct{} - watchErrCh <-chan error - notifyCloser func() - watchErrors int - watchReady bool + kubernetesClient *kubernetes.Client + nodewatcher *nodewatch.NodeWatcher + watchCtxCancel context.CancelFunc + notifyCh <-chan struct{} + watchErrCh <-chan error + notifyCloser func() + watchErrors int + watchReady bool + watcherKubeconfigVer string ) closeWatcher := func() { @@ -95,6 +102,7 @@ func (ctrl *NodeStatusController) Run(ctx context.Context, r controller.Runtime, watchErrors = 0 watchReady = false nodewatcher = nil + watcherKubeconfigVer = "" } defer closeWatcher() @@ -140,11 +148,37 @@ func (ctrl *NodeStatusController) Run(ctx context.Context, r controller.Runtime, return err } + // Look up the current kubelet kubeconfig hash. If it is not yet published, + // the kubeconfig was read by WaitForKubeconfigReady but the + // KubeletKubeconfigController hasn't written its resource yet — wait for it + // so we never bind a watcher to a hash we haven't recorded. + kubeconfigRes, err := safe.ReaderGetByID[*k8s.KubeletKubeconfig](ctx, r, k8s.KubeletKubeconfigID) + if err != nil { + if !state.IsNotFoundError(err) { + return fmt.Errorf("error getting kubelet kubeconfig: %w", err) + } + + continue + } + + currentKubeconfigVer := kubeconfigRes.TypedSpec().Hash + if nodewatcher != nil && nodewatcher.Nodename() != nodename.TypedSpec().Nodename { // nodename changed, so we need to reinitialize the watcher closeWatcher() } + if nodewatcher != nil && watcherKubeconfigVer != currentKubeconfigVer { + // kubelet kubeconfig on disk changed — the cached client may be pinned + // to a stale endpoint, so rebuild the watcher with a fresh client. + logger.Info("kubelet kubeconfig changed, restarting node watcher", + zap.String("old_hash", watcherKubeconfigVer), + zap.String("new_hash", currentKubeconfigVer), + ) + + closeWatcher() + } + if kubernetesClient == nil { kubernetesClient, err = kubernetes.NewClientFromKubeletKubeconfig() if err != nil { @@ -165,6 +199,8 @@ func (ctrl *NodeStatusController) Run(ctx context.Context, r controller.Runtime, if err != nil { return fmt.Errorf("error setting up node watcher: %w", err) //nolint:govet } + + watcherKubeconfigVer = currentKubeconfigVer } if !watchReady { diff --git a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go index 1d2ad31d2..92e784126 100644 --- a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go +++ b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go @@ -257,6 +257,7 @@ func (ctrl *Controller) Run(ctx context.Context, drainer *runtime.Drainer) error &k8s.EndpointController{}, &k8s.ExtraManifestController{}, k8s.NewKubeletConfigController(), + &k8s.KubeletKubeconfigController{}, &k8s.KubeletServiceController{ V1Alpha1Services: system.Services(ctrl.v1alpha1Runtime), V1Alpha1Mode: ctrl.v1alpha1Runtime.State().Platform().Mode(), diff --git a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go index a9010df9a..135f6af5c 100644 --- a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go +++ b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go @@ -147,6 +147,7 @@ func NewState() (*State, error) { &k8s.Endpoint{}, &k8s.ExtraManifestsConfig{}, &k8s.KubeletConfig{}, + &k8s.KubeletKubeconfig{}, &k8s.KubeletLifecycle{}, &k8s.KubeletSpec{}, &k8s.KubePrismConfig{}, diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index 3d9bcc228..5605afe55 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net" "net/url" "os" "time" @@ -52,6 +53,16 @@ func NewClientFromKubeletKubeconfig() (*Client, error) { return nil, err } + // Set an explicit dial timeout so that requests to a stale/unreachable + // API server endpoint fail fast instead of hanging indefinitely at the TCP + // layer (the default Linux tcp_syn_retries can cause connect() to block for + // over two minutes). This only affects establishing new TCP connections, + // not the lifetime of in-flight watches. + config.Dial = (&net.Dialer{ + Timeout: 15 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext + return NewForConfig(config) } diff --git a/pkg/machinery/api/resource/definitions/k8s/k8s.pb.go b/pkg/machinery/api/resource/definitions/k8s/k8s.pb.go index dc18718fc..73028baf0 100644 --- a/pkg/machinery/api/resource/definitions/k8s/k8s.pb.go +++ b/pkg/machinery/api/resource/definitions/k8s/k8s.pb.go @@ -1417,6 +1417,51 @@ func (x *KubeletConfigSpec) GetExtraArgs() map[string]*ArgValues { return nil } +// KubeletKubeconfigSpec describes the current kubelet kubeconfig file. +type KubeletKubeconfigSpec struct { + state protoimpl.MessageState `protogen:"open.v1"` + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeletKubeconfigSpec) Reset() { + *x = KubeletKubeconfigSpec{} + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeletKubeconfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeletKubeconfigSpec) ProtoMessage() {} + +func (x *KubeletKubeconfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeletKubeconfigSpec.ProtoReflect.Descriptor instead. +func (*KubeletKubeconfigSpec) Descriptor() ([]byte, []int) { + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{19} +} + +func (x *KubeletKubeconfigSpec) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + // KubeletSpecSpec holds the source of kubelet configuration. type KubeletSpecSpec struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1432,7 +1477,7 @@ type KubeletSpecSpec struct { func (x *KubeletSpecSpec) Reset() { *x = KubeletSpecSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[19] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1444,7 +1489,7 @@ func (x *KubeletSpecSpec) String() string { func (*KubeletSpecSpec) ProtoMessage() {} func (x *KubeletSpecSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[19] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1457,7 +1502,7 @@ func (x *KubeletSpecSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeletSpecSpec.ProtoReflect.Descriptor instead. func (*KubeletSpecSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{19} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{20} } func (x *KubeletSpecSpec) GetImage() string { @@ -1512,7 +1557,7 @@ type ManifestSpec struct { func (x *ManifestSpec) Reset() { *x = ManifestSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[20] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1524,7 +1569,7 @@ func (x *ManifestSpec) String() string { func (*ManifestSpec) ProtoMessage() {} func (x *ManifestSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[20] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1537,7 +1582,7 @@ func (x *ManifestSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use ManifestSpec.ProtoReflect.Descriptor instead. func (*ManifestSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{20} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{21} } func (x *ManifestSpec) GetItems() []*SingleManifest { @@ -1557,7 +1602,7 @@ type ManifestStatusSpec struct { func (x *ManifestStatusSpec) Reset() { *x = ManifestStatusSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[21] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1569,7 +1614,7 @@ func (x *ManifestStatusSpec) String() string { func (*ManifestStatusSpec) ProtoMessage() {} func (x *ManifestStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[21] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1582,7 +1627,7 @@ func (x *ManifestStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use ManifestStatusSpec.ProtoReflect.Descriptor instead. func (*ManifestStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{21} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{22} } func (x *ManifestStatusSpec) GetManifestsApplied() []string { @@ -1603,7 +1648,7 @@ type NodeAnnotationSpecSpec struct { func (x *NodeAnnotationSpecSpec) Reset() { *x = NodeAnnotationSpecSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[22] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1615,7 +1660,7 @@ func (x *NodeAnnotationSpecSpec) String() string { func (*NodeAnnotationSpecSpec) ProtoMessage() {} func (x *NodeAnnotationSpecSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[22] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1628,7 +1673,7 @@ func (x *NodeAnnotationSpecSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeAnnotationSpecSpec.ProtoReflect.Descriptor instead. func (*NodeAnnotationSpecSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{22} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{23} } func (x *NodeAnnotationSpecSpec) GetKey() string { @@ -1656,7 +1701,7 @@ type NodeIPConfigSpec struct { func (x *NodeIPConfigSpec) Reset() { *x = NodeIPConfigSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[23] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1668,7 +1713,7 @@ func (x *NodeIPConfigSpec) String() string { func (*NodeIPConfigSpec) ProtoMessage() {} func (x *NodeIPConfigSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[23] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1681,7 +1726,7 @@ func (x *NodeIPConfigSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeIPConfigSpec.ProtoReflect.Descriptor instead. func (*NodeIPConfigSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{23} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{24} } func (x *NodeIPConfigSpec) GetValidSubnets() []string { @@ -1708,7 +1753,7 @@ type NodeIPSpec struct { func (x *NodeIPSpec) Reset() { *x = NodeIPSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[24] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1720,7 +1765,7 @@ func (x *NodeIPSpec) String() string { func (*NodeIPSpec) ProtoMessage() {} func (x *NodeIPSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[24] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1733,7 +1778,7 @@ func (x *NodeIPSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeIPSpec.ProtoReflect.Descriptor instead. func (*NodeIPSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{24} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{25} } func (x *NodeIPSpec) GetAddresses() []*common.NetIP { @@ -1754,7 +1799,7 @@ type NodeLabelSpecSpec struct { func (x *NodeLabelSpecSpec) Reset() { *x = NodeLabelSpecSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[25] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1766,7 +1811,7 @@ func (x *NodeLabelSpecSpec) String() string { func (*NodeLabelSpecSpec) ProtoMessage() {} func (x *NodeLabelSpecSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[25] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1779,7 +1824,7 @@ func (x *NodeLabelSpecSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeLabelSpecSpec.ProtoReflect.Descriptor instead. func (*NodeLabelSpecSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{25} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{26} } func (x *NodeLabelSpecSpec) GetKey() string { @@ -1811,7 +1856,7 @@ type NodeStatusSpec struct { func (x *NodeStatusSpec) Reset() { *x = NodeStatusSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[26] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1823,7 +1868,7 @@ func (x *NodeStatusSpec) String() string { func (*NodeStatusSpec) ProtoMessage() {} func (x *NodeStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[26] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1836,7 +1881,7 @@ func (x *NodeStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeStatusSpec.ProtoReflect.Descriptor instead. func (*NodeStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{26} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{27} } func (x *NodeStatusSpec) GetNodename() string { @@ -1893,7 +1938,7 @@ type NodeTaintSpecSpec struct { func (x *NodeTaintSpecSpec) Reset() { *x = NodeTaintSpecSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[27] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1905,7 +1950,7 @@ func (x *NodeTaintSpecSpec) String() string { func (*NodeTaintSpecSpec) ProtoMessage() {} func (x *NodeTaintSpecSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[27] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1918,7 +1963,7 @@ func (x *NodeTaintSpecSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeTaintSpecSpec.ProtoReflect.Descriptor instead. func (*NodeTaintSpecSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{27} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{28} } func (x *NodeTaintSpecSpec) GetKey() string { @@ -1954,7 +1999,7 @@ type NodenameSpec struct { func (x *NodenameSpec) Reset() { *x = NodenameSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[28] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1966,7 +2011,7 @@ func (x *NodenameSpec) String() string { func (*NodenameSpec) ProtoMessage() {} func (x *NodenameSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[28] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1979,7 +2024,7 @@ func (x *NodenameSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use NodenameSpec.ProtoReflect.Descriptor instead. func (*NodenameSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{28} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{29} } func (x *NodenameSpec) GetNodename() string { @@ -2014,7 +2059,7 @@ type Resources struct { func (x *Resources) Reset() { *x = Resources{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[29] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2026,7 +2071,7 @@ func (x *Resources) String() string { func (*Resources) ProtoMessage() {} func (x *Resources) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[29] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2039,7 +2084,7 @@ func (x *Resources) ProtoReflect() protoreflect.Message { // Deprecated: Use Resources.ProtoReflect.Descriptor instead. func (*Resources) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{29} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{30} } func (x *Resources) GetRequests() map[string]string { @@ -2072,7 +2117,7 @@ type SchedulerConfigSpec struct { func (x *SchedulerConfigSpec) Reset() { *x = SchedulerConfigSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[30] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2084,7 +2129,7 @@ func (x *SchedulerConfigSpec) String() string { func (*SchedulerConfigSpec) ProtoMessage() {} func (x *SchedulerConfigSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[30] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2097,7 +2142,7 @@ func (x *SchedulerConfigSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use SchedulerConfigSpec.ProtoReflect.Descriptor instead. func (*SchedulerConfigSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{30} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{31} } func (x *SchedulerConfigSpec) GetEnabled() bool { @@ -2160,7 +2205,7 @@ type SecretsStatusSpec struct { func (x *SecretsStatusSpec) Reset() { *x = SecretsStatusSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[31] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2172,7 +2217,7 @@ func (x *SecretsStatusSpec) String() string { func (*SecretsStatusSpec) ProtoMessage() {} func (x *SecretsStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[31] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2185,7 +2230,7 @@ func (x *SecretsStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use SecretsStatusSpec.ProtoReflect.Descriptor instead. func (*SecretsStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{31} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{32} } func (x *SecretsStatusSpec) GetReady() bool { @@ -2212,7 +2257,7 @@ type SingleManifest struct { func (x *SingleManifest) Reset() { *x = SingleManifest{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[32] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2224,7 +2269,7 @@ func (x *SingleManifest) String() string { func (*SingleManifest) ProtoMessage() {} func (x *SingleManifest) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[32] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2237,7 +2282,7 @@ func (x *SingleManifest) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleManifest.ProtoReflect.Descriptor instead. func (*SingleManifest) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{32} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{33} } func (x *SingleManifest) GetObject() *structpb.Struct { @@ -2257,7 +2302,7 @@ type StaticPodServerStatusSpec struct { func (x *StaticPodServerStatusSpec) Reset() { *x = StaticPodServerStatusSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[33] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2269,7 +2314,7 @@ func (x *StaticPodServerStatusSpec) String() string { func (*StaticPodServerStatusSpec) ProtoMessage() {} func (x *StaticPodServerStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[33] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2282,7 +2327,7 @@ func (x *StaticPodServerStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use StaticPodServerStatusSpec.ProtoReflect.Descriptor instead. func (*StaticPodServerStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{33} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{34} } func (x *StaticPodServerStatusSpec) GetUrl() string { @@ -2302,7 +2347,7 @@ type StaticPodSpec struct { func (x *StaticPodSpec) Reset() { *x = StaticPodSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[34] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2314,7 +2359,7 @@ func (x *StaticPodSpec) String() string { func (*StaticPodSpec) ProtoMessage() {} func (x *StaticPodSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[34] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2327,7 +2372,7 @@ func (x *StaticPodSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use StaticPodSpec.ProtoReflect.Descriptor instead. func (*StaticPodSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{34} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{35} } func (x *StaticPodSpec) GetPod() *structpb.Struct { @@ -2347,7 +2392,7 @@ type StaticPodStatusSpec struct { func (x *StaticPodStatusSpec) Reset() { *x = StaticPodStatusSpec{} - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[35] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2359,7 +2404,7 @@ func (x *StaticPodStatusSpec) String() string { func (*StaticPodStatusSpec) ProtoMessage() {} func (x *StaticPodStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[35] + mi := &file_resource_definitions_k8s_k8s_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2372,7 +2417,7 @@ func (x *StaticPodStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use StaticPodStatusSpec.ProtoReflect.Descriptor instead. func (*StaticPodStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{35} + return file_resource_definitions_k8s_k8s_proto_rawDescGZIP(), []int{36} } func (x *StaticPodStatusSpec) GetPodStatus() *structpb.Struct { @@ -2522,7 +2567,9 @@ const file_resource_definitions_k8s_k8s_proto_rawDesc = "" + "extra_args\x18\x0f \x03(\v2@.talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntryR\textraArgs\x1ag\n" + "\x0eExtraArgsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12?\n" + - "\x05value\x18\x02 \x01(\v2).talos.resource.definitions.k8s.ArgValuesR\x05value:\x028\x01\"\xbc\x02\n" + + "\x05value\x18\x02 \x01(\v2).talos.resource.definitions.k8s.ArgValuesR\x05value:\x028\x01\"+\n" + + "\x15KubeletKubeconfigSpec\x12\x12\n" + + "\x04hash\x18\x01 \x01(\tR\x04hash\"\xbc\x02\n" + "\x0fKubeletSpecSpec\x12\x14\n" + "\x05image\x18\x01 \x01(\tR\x05image\x12\x12\n" + "\x04args\x18\x02 \x03(\tR\x04args\x12J\n" + @@ -2619,7 +2666,7 @@ func file_resource_definitions_k8s_k8s_proto_rawDescGZIP() []byte { return file_resource_definitions_k8s_k8s_proto_rawDescData } -var file_resource_definitions_k8s_k8s_proto_msgTypes = make([]protoimpl.MessageInfo, 48) +var file_resource_definitions_k8s_k8s_proto_msgTypes = make([]protoimpl.MessageInfo, 49) var file_resource_definitions_k8s_k8s_proto_goTypes = []any{ (*APIServerConfigSpec)(nil), // 0: talos.resource.definitions.k8s.APIServerConfigSpec (*AdmissionControlConfigSpec)(nil), // 1: talos.resource.definitions.k8s.AdmissionControlConfigSpec @@ -2640,81 +2687,82 @@ var file_resource_definitions_k8s_k8s_proto_goTypes = []any{ (*KubePrismEndpointsSpec)(nil), // 16: talos.resource.definitions.k8s.KubePrismEndpointsSpec (*KubePrismStatusesSpec)(nil), // 17: talos.resource.definitions.k8s.KubePrismStatusesSpec (*KubeletConfigSpec)(nil), // 18: talos.resource.definitions.k8s.KubeletConfigSpec - (*KubeletSpecSpec)(nil), // 19: talos.resource.definitions.k8s.KubeletSpecSpec - (*ManifestSpec)(nil), // 20: talos.resource.definitions.k8s.ManifestSpec - (*ManifestStatusSpec)(nil), // 21: talos.resource.definitions.k8s.ManifestStatusSpec - (*NodeAnnotationSpecSpec)(nil), // 22: talos.resource.definitions.k8s.NodeAnnotationSpecSpec - (*NodeIPConfigSpec)(nil), // 23: talos.resource.definitions.k8s.NodeIPConfigSpec - (*NodeIPSpec)(nil), // 24: talos.resource.definitions.k8s.NodeIPSpec - (*NodeLabelSpecSpec)(nil), // 25: talos.resource.definitions.k8s.NodeLabelSpecSpec - (*NodeStatusSpec)(nil), // 26: talos.resource.definitions.k8s.NodeStatusSpec - (*NodeTaintSpecSpec)(nil), // 27: talos.resource.definitions.k8s.NodeTaintSpecSpec - (*NodenameSpec)(nil), // 28: talos.resource.definitions.k8s.NodenameSpec - (*Resources)(nil), // 29: talos.resource.definitions.k8s.Resources - (*SchedulerConfigSpec)(nil), // 30: talos.resource.definitions.k8s.SchedulerConfigSpec - (*SecretsStatusSpec)(nil), // 31: talos.resource.definitions.k8s.SecretsStatusSpec - (*SingleManifest)(nil), // 32: talos.resource.definitions.k8s.SingleManifest - (*StaticPodServerStatusSpec)(nil), // 33: talos.resource.definitions.k8s.StaticPodServerStatusSpec - (*StaticPodSpec)(nil), // 34: talos.resource.definitions.k8s.StaticPodSpec - (*StaticPodStatusSpec)(nil), // 35: talos.resource.definitions.k8s.StaticPodStatusSpec - nil, // 36: talos.resource.definitions.k8s.APIServerConfigSpec.EnvironmentVariablesEntry - nil, // 37: talos.resource.definitions.k8s.APIServerConfigSpec.ExtraArgsEntry - nil, // 38: talos.resource.definitions.k8s.ControllerManagerConfigSpec.EnvironmentVariablesEntry - nil, // 39: talos.resource.definitions.k8s.ControllerManagerConfigSpec.ExtraArgsEntry - nil, // 40: talos.resource.definitions.k8s.ExtraManifest.ExtraHeadersEntry - nil, // 41: talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntry - nil, // 42: talos.resource.definitions.k8s.NodeStatusSpec.LabelsEntry - nil, // 43: talos.resource.definitions.k8s.NodeStatusSpec.AnnotationsEntry - nil, // 44: talos.resource.definitions.k8s.Resources.RequestsEntry - nil, // 45: talos.resource.definitions.k8s.Resources.LimitsEntry - nil, // 46: talos.resource.definitions.k8s.SchedulerConfigSpec.EnvironmentVariablesEntry - nil, // 47: talos.resource.definitions.k8s.SchedulerConfigSpec.ExtraArgsEntry - (*structpb.Struct)(nil), // 48: google.protobuf.Struct - (*common.NetIP)(nil), // 49: common.NetIP - (*proto.Mount)(nil), // 50: talos.resource.definitions.proto.Mount - (*common.NetIPPrefix)(nil), // 51: common.NetIPPrefix + (*KubeletKubeconfigSpec)(nil), // 19: talos.resource.definitions.k8s.KubeletKubeconfigSpec + (*KubeletSpecSpec)(nil), // 20: talos.resource.definitions.k8s.KubeletSpecSpec + (*ManifestSpec)(nil), // 21: talos.resource.definitions.k8s.ManifestSpec + (*ManifestStatusSpec)(nil), // 22: talos.resource.definitions.k8s.ManifestStatusSpec + (*NodeAnnotationSpecSpec)(nil), // 23: talos.resource.definitions.k8s.NodeAnnotationSpecSpec + (*NodeIPConfigSpec)(nil), // 24: talos.resource.definitions.k8s.NodeIPConfigSpec + (*NodeIPSpec)(nil), // 25: talos.resource.definitions.k8s.NodeIPSpec + (*NodeLabelSpecSpec)(nil), // 26: talos.resource.definitions.k8s.NodeLabelSpecSpec + (*NodeStatusSpec)(nil), // 27: talos.resource.definitions.k8s.NodeStatusSpec + (*NodeTaintSpecSpec)(nil), // 28: talos.resource.definitions.k8s.NodeTaintSpecSpec + (*NodenameSpec)(nil), // 29: talos.resource.definitions.k8s.NodenameSpec + (*Resources)(nil), // 30: talos.resource.definitions.k8s.Resources + (*SchedulerConfigSpec)(nil), // 31: talos.resource.definitions.k8s.SchedulerConfigSpec + (*SecretsStatusSpec)(nil), // 32: talos.resource.definitions.k8s.SecretsStatusSpec + (*SingleManifest)(nil), // 33: talos.resource.definitions.k8s.SingleManifest + (*StaticPodServerStatusSpec)(nil), // 34: talos.resource.definitions.k8s.StaticPodServerStatusSpec + (*StaticPodSpec)(nil), // 35: talos.resource.definitions.k8s.StaticPodSpec + (*StaticPodStatusSpec)(nil), // 36: talos.resource.definitions.k8s.StaticPodStatusSpec + nil, // 37: talos.resource.definitions.k8s.APIServerConfigSpec.EnvironmentVariablesEntry + nil, // 38: talos.resource.definitions.k8s.APIServerConfigSpec.ExtraArgsEntry + nil, // 39: talos.resource.definitions.k8s.ControllerManagerConfigSpec.EnvironmentVariablesEntry + nil, // 40: talos.resource.definitions.k8s.ControllerManagerConfigSpec.ExtraArgsEntry + nil, // 41: talos.resource.definitions.k8s.ExtraManifest.ExtraHeadersEntry + nil, // 42: talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntry + nil, // 43: talos.resource.definitions.k8s.NodeStatusSpec.LabelsEntry + nil, // 44: talos.resource.definitions.k8s.NodeStatusSpec.AnnotationsEntry + nil, // 45: talos.resource.definitions.k8s.Resources.RequestsEntry + nil, // 46: talos.resource.definitions.k8s.Resources.LimitsEntry + nil, // 47: talos.resource.definitions.k8s.SchedulerConfigSpec.EnvironmentVariablesEntry + nil, // 48: talos.resource.definitions.k8s.SchedulerConfigSpec.ExtraArgsEntry + (*structpb.Struct)(nil), // 49: google.protobuf.Struct + (*common.NetIP)(nil), // 50: common.NetIP + (*proto.Mount)(nil), // 51: talos.resource.definitions.proto.Mount + (*common.NetIPPrefix)(nil), // 52: common.NetIPPrefix } var file_resource_definitions_k8s_k8s_proto_depIdxs = []int32{ 13, // 0: talos.resource.definitions.k8s.APIServerConfigSpec.extra_volumes:type_name -> talos.resource.definitions.k8s.ExtraVolume - 36, // 1: talos.resource.definitions.k8s.APIServerConfigSpec.environment_variables:type_name -> talos.resource.definitions.k8s.APIServerConfigSpec.EnvironmentVariablesEntry - 29, // 2: talos.resource.definitions.k8s.APIServerConfigSpec.resources:type_name -> talos.resource.definitions.k8s.Resources - 37, // 3: talos.resource.definitions.k8s.APIServerConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.APIServerConfigSpec.ExtraArgsEntry + 37, // 1: talos.resource.definitions.k8s.APIServerConfigSpec.environment_variables:type_name -> talos.resource.definitions.k8s.APIServerConfigSpec.EnvironmentVariablesEntry + 30, // 2: talos.resource.definitions.k8s.APIServerConfigSpec.resources:type_name -> talos.resource.definitions.k8s.Resources + 38, // 3: talos.resource.definitions.k8s.APIServerConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.APIServerConfigSpec.ExtraArgsEntry 2, // 4: talos.resource.definitions.k8s.AdmissionControlConfigSpec.config:type_name -> talos.resource.definitions.k8s.AdmissionPluginSpec - 48, // 5: talos.resource.definitions.k8s.AdmissionPluginSpec.configuration:type_name -> google.protobuf.Struct - 48, // 6: talos.resource.definitions.k8s.AuditPolicyConfigSpec.config:type_name -> google.protobuf.Struct - 48, // 7: talos.resource.definitions.k8s.AuthorizationAuthorizersSpec.webhook:type_name -> google.protobuf.Struct + 49, // 5: talos.resource.definitions.k8s.AdmissionPluginSpec.configuration:type_name -> google.protobuf.Struct + 49, // 6: talos.resource.definitions.k8s.AuditPolicyConfigSpec.config:type_name -> google.protobuf.Struct + 49, // 7: talos.resource.definitions.k8s.AuthorizationAuthorizersSpec.webhook:type_name -> google.protobuf.Struct 5, // 8: talos.resource.definitions.k8s.AuthorizationConfigSpec.config:type_name -> talos.resource.definitions.k8s.AuthorizationAuthorizersSpec 13, // 9: talos.resource.definitions.k8s.ControllerManagerConfigSpec.extra_volumes:type_name -> talos.resource.definitions.k8s.ExtraVolume - 38, // 10: talos.resource.definitions.k8s.ControllerManagerConfigSpec.environment_variables:type_name -> talos.resource.definitions.k8s.ControllerManagerConfigSpec.EnvironmentVariablesEntry - 29, // 11: talos.resource.definitions.k8s.ControllerManagerConfigSpec.resources:type_name -> talos.resource.definitions.k8s.Resources - 39, // 12: talos.resource.definitions.k8s.ControllerManagerConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.ControllerManagerConfigSpec.ExtraArgsEntry - 49, // 13: talos.resource.definitions.k8s.EndpointSpec.addresses:type_name -> common.NetIP - 40, // 14: talos.resource.definitions.k8s.ExtraManifest.extra_headers:type_name -> talos.resource.definitions.k8s.ExtraManifest.ExtraHeadersEntry + 39, // 10: talos.resource.definitions.k8s.ControllerManagerConfigSpec.environment_variables:type_name -> talos.resource.definitions.k8s.ControllerManagerConfigSpec.EnvironmentVariablesEntry + 30, // 11: talos.resource.definitions.k8s.ControllerManagerConfigSpec.resources:type_name -> talos.resource.definitions.k8s.Resources + 40, // 12: talos.resource.definitions.k8s.ControllerManagerConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.ControllerManagerConfigSpec.ExtraArgsEntry + 50, // 13: talos.resource.definitions.k8s.EndpointSpec.addresses:type_name -> common.NetIP + 41, // 14: talos.resource.definitions.k8s.ExtraManifest.extra_headers:type_name -> talos.resource.definitions.k8s.ExtraManifest.ExtraHeadersEntry 11, // 15: talos.resource.definitions.k8s.ExtraManifestsConfigSpec.extra_manifests:type_name -> talos.resource.definitions.k8s.ExtraManifest 15, // 16: talos.resource.definitions.k8s.KubePrismConfigSpec.endpoints:type_name -> talos.resource.definitions.k8s.KubePrismEndpoint 15, // 17: talos.resource.definitions.k8s.KubePrismEndpointsSpec.endpoints:type_name -> talos.resource.definitions.k8s.KubePrismEndpoint - 50, // 18: talos.resource.definitions.k8s.KubeletConfigSpec.extra_mounts:type_name -> talos.resource.definitions.proto.Mount - 48, // 19: talos.resource.definitions.k8s.KubeletConfigSpec.extra_config:type_name -> google.protobuf.Struct - 48, // 20: talos.resource.definitions.k8s.KubeletConfigSpec.credential_provider_config:type_name -> google.protobuf.Struct - 41, // 21: talos.resource.definitions.k8s.KubeletConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntry - 50, // 22: talos.resource.definitions.k8s.KubeletSpecSpec.extra_mounts:type_name -> talos.resource.definitions.proto.Mount - 48, // 23: talos.resource.definitions.k8s.KubeletSpecSpec.config:type_name -> google.protobuf.Struct - 48, // 24: talos.resource.definitions.k8s.KubeletSpecSpec.credential_provider_config:type_name -> google.protobuf.Struct - 32, // 25: talos.resource.definitions.k8s.ManifestSpec.items:type_name -> talos.resource.definitions.k8s.SingleManifest - 49, // 26: talos.resource.definitions.k8s.NodeIPSpec.addresses:type_name -> common.NetIP - 42, // 27: talos.resource.definitions.k8s.NodeStatusSpec.labels:type_name -> talos.resource.definitions.k8s.NodeStatusSpec.LabelsEntry - 43, // 28: talos.resource.definitions.k8s.NodeStatusSpec.annotations:type_name -> talos.resource.definitions.k8s.NodeStatusSpec.AnnotationsEntry - 51, // 29: talos.resource.definitions.k8s.NodeStatusSpec.pod_cid_rs:type_name -> common.NetIPPrefix - 44, // 30: talos.resource.definitions.k8s.Resources.requests:type_name -> talos.resource.definitions.k8s.Resources.RequestsEntry - 45, // 31: talos.resource.definitions.k8s.Resources.limits:type_name -> talos.resource.definitions.k8s.Resources.LimitsEntry + 51, // 18: talos.resource.definitions.k8s.KubeletConfigSpec.extra_mounts:type_name -> talos.resource.definitions.proto.Mount + 49, // 19: talos.resource.definitions.k8s.KubeletConfigSpec.extra_config:type_name -> google.protobuf.Struct + 49, // 20: talos.resource.definitions.k8s.KubeletConfigSpec.credential_provider_config:type_name -> google.protobuf.Struct + 42, // 21: talos.resource.definitions.k8s.KubeletConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntry + 51, // 22: talos.resource.definitions.k8s.KubeletSpecSpec.extra_mounts:type_name -> talos.resource.definitions.proto.Mount + 49, // 23: talos.resource.definitions.k8s.KubeletSpecSpec.config:type_name -> google.protobuf.Struct + 49, // 24: talos.resource.definitions.k8s.KubeletSpecSpec.credential_provider_config:type_name -> google.protobuf.Struct + 33, // 25: talos.resource.definitions.k8s.ManifestSpec.items:type_name -> talos.resource.definitions.k8s.SingleManifest + 50, // 26: talos.resource.definitions.k8s.NodeIPSpec.addresses:type_name -> common.NetIP + 43, // 27: talos.resource.definitions.k8s.NodeStatusSpec.labels:type_name -> talos.resource.definitions.k8s.NodeStatusSpec.LabelsEntry + 44, // 28: talos.resource.definitions.k8s.NodeStatusSpec.annotations:type_name -> talos.resource.definitions.k8s.NodeStatusSpec.AnnotationsEntry + 52, // 29: talos.resource.definitions.k8s.NodeStatusSpec.pod_cid_rs:type_name -> common.NetIPPrefix + 45, // 30: talos.resource.definitions.k8s.Resources.requests:type_name -> talos.resource.definitions.k8s.Resources.RequestsEntry + 46, // 31: talos.resource.definitions.k8s.Resources.limits:type_name -> talos.resource.definitions.k8s.Resources.LimitsEntry 13, // 32: talos.resource.definitions.k8s.SchedulerConfigSpec.extra_volumes:type_name -> talos.resource.definitions.k8s.ExtraVolume - 46, // 33: talos.resource.definitions.k8s.SchedulerConfigSpec.environment_variables:type_name -> talos.resource.definitions.k8s.SchedulerConfigSpec.EnvironmentVariablesEntry - 29, // 34: talos.resource.definitions.k8s.SchedulerConfigSpec.resources:type_name -> talos.resource.definitions.k8s.Resources - 48, // 35: talos.resource.definitions.k8s.SchedulerConfigSpec.config:type_name -> google.protobuf.Struct - 47, // 36: talos.resource.definitions.k8s.SchedulerConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.SchedulerConfigSpec.ExtraArgsEntry - 48, // 37: talos.resource.definitions.k8s.SingleManifest.object:type_name -> google.protobuf.Struct - 48, // 38: talos.resource.definitions.k8s.StaticPodSpec.pod:type_name -> google.protobuf.Struct - 48, // 39: talos.resource.definitions.k8s.StaticPodStatusSpec.pod_status:type_name -> google.protobuf.Struct + 47, // 33: talos.resource.definitions.k8s.SchedulerConfigSpec.environment_variables:type_name -> talos.resource.definitions.k8s.SchedulerConfigSpec.EnvironmentVariablesEntry + 30, // 34: talos.resource.definitions.k8s.SchedulerConfigSpec.resources:type_name -> talos.resource.definitions.k8s.Resources + 49, // 35: talos.resource.definitions.k8s.SchedulerConfigSpec.config:type_name -> google.protobuf.Struct + 48, // 36: talos.resource.definitions.k8s.SchedulerConfigSpec.extra_args:type_name -> talos.resource.definitions.k8s.SchedulerConfigSpec.ExtraArgsEntry + 49, // 37: talos.resource.definitions.k8s.SingleManifest.object:type_name -> google.protobuf.Struct + 49, // 38: talos.resource.definitions.k8s.StaticPodSpec.pod:type_name -> google.protobuf.Struct + 49, // 39: talos.resource.definitions.k8s.StaticPodStatusSpec.pod_status:type_name -> google.protobuf.Struct 3, // 40: talos.resource.definitions.k8s.APIServerConfigSpec.ExtraArgsEntry.value:type_name -> talos.resource.definitions.k8s.ArgValues 3, // 41: talos.resource.definitions.k8s.ControllerManagerConfigSpec.ExtraArgsEntry.value:type_name -> talos.resource.definitions.k8s.ArgValues 3, // 42: talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntry.value:type_name -> talos.resource.definitions.k8s.ArgValues @@ -2737,7 +2785,7 @@ func file_resource_definitions_k8s_k8s_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_resource_definitions_k8s_k8s_proto_rawDesc), len(file_resource_definitions_k8s_k8s_proto_rawDesc)), NumEnums: 0, - NumMessages: 48, + NumMessages: 49, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/machinery/api/resource/definitions/k8s/k8s_vtproto.pb.go b/pkg/machinery/api/resource/definitions/k8s/k8s_vtproto.pb.go index b015ce3ee..81faba89e 100644 --- a/pkg/machinery/api/resource/definitions/k8s/k8s_vtproto.pb.go +++ b/pkg/machinery/api/resource/definitions/k8s/k8s_vtproto.pb.go @@ -1499,6 +1499,46 @@ func (m *KubeletConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *KubeletKubeconfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubeletKubeconfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubeletKubeconfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *KubeletSpecSpec) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -3138,6 +3178,20 @@ func (m *KubeletConfigSpec) SizeVT() (n int) { return n } +func (m *KubeletKubeconfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + func (m *KubeletSpecSpec) SizeVT() (n int) { if m == nil { return 0 @@ -7664,6 +7718,89 @@ func (m *KubeletConfigSpec) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *KubeletKubeconfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubeletKubeconfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubeletKubeconfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *KubeletSpecSpec) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/machinery/resources/k8s/deep_copy.generated.go b/pkg/machinery/resources/k8s/deep_copy.generated.go index 022b0bc76..14d17f74f 100644 --- a/pkg/machinery/resources/k8s/deep_copy.generated.go +++ b/pkg/machinery/resources/k8s/deep_copy.generated.go @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -// Code generated by "deep-copy -type AdmissionControlConfigSpec -type APIServerConfigSpec -type AuditPolicyConfigSpec -type AuthorizationConfigSpec -type BootstrapManifestsConfigSpec -type ConfigStatusSpec -type ControllerManagerConfigSpec -type EndpointSpec -type ExtraManifestsConfigSpec -type KubeletLifecycleSpec -type KubePrismConfigSpec -type KubePrismEndpointsSpec -type KubePrismStatusesSpec -type KubeletSpecSpec -type ManifestSpec -type ManifestStatusSpec -type NodeAnnotationSpecSpec -type NodeCordonedSpecSpec -type NodeLabelSpecSpec -type NodeTaintSpecSpec -type KubeletConfigSpec -type NodeIPSpec -type NodeIPConfigSpec -type NodeStatusSpec -type NodenameSpec -type SchedulerConfigSpec -type SecretsStatusSpec -type StaticPodSpec -type StaticPodStatusSpec -type StaticPodServerStatusSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go ."; DO NOT EDIT. +// Code generated by "deep-copy -type AdmissionControlConfigSpec -type APIServerConfigSpec -type AuditPolicyConfigSpec -type AuthorizationConfigSpec -type BootstrapManifestsConfigSpec -type ConfigStatusSpec -type ControllerManagerConfigSpec -type EndpointSpec -type ExtraManifestsConfigSpec -type KubeletKubeconfigSpec -type KubeletLifecycleSpec -type KubePrismConfigSpec -type KubePrismEndpointsSpec -type KubePrismStatusesSpec -type KubeletSpecSpec -type ManifestSpec -type ManifestStatusSpec -type NodeAnnotationSpecSpec -type NodeCordonedSpecSpec -type NodeLabelSpecSpec -type NodeTaintSpecSpec -type KubeletConfigSpec -type NodeIPSpec -type NodeIPConfigSpec -type NodeStatusSpec -type NodenameSpec -type SchedulerConfigSpec -type SecretsStatusSpec -type StaticPodSpec -type StaticPodStatusSpec -type StaticPodServerStatusSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go ."; DO NOT EDIT. package k8s @@ -210,6 +210,12 @@ func (o ExtraManifestsConfigSpec) DeepCopy() ExtraManifestsConfigSpec { return cp } +// DeepCopy generates a deep copy of KubeletKubeconfigSpec. +func (o KubeletKubeconfigSpec) DeepCopy() KubeletKubeconfigSpec { + var cp KubeletKubeconfigSpec = o + return cp +} + // DeepCopy generates a deep copy of KubeletLifecycleSpec. func (o KubeletLifecycleSpec) DeepCopy() KubeletLifecycleSpec { var cp KubeletLifecycleSpec = o diff --git a/pkg/machinery/resources/k8s/k8s.go b/pkg/machinery/resources/k8s/k8s.go index 7afd18c34..d89d813f5 100644 --- a/pkg/machinery/resources/k8s/k8s.go +++ b/pkg/machinery/resources/k8s/k8s.go @@ -7,7 +7,7 @@ package k8s import "github.com/cosi-project/runtime/pkg/resource" -//go:generate go tool github.com/siderolabs/deep-copy -type AdmissionControlConfigSpec -type APIServerConfigSpec -type AuditPolicyConfigSpec -type AuthorizationConfigSpec -type BootstrapManifestsConfigSpec -type ConfigStatusSpec -type ControllerManagerConfigSpec -type EndpointSpec -type ExtraManifestsConfigSpec -type KubeletLifecycleSpec -type KubePrismConfigSpec -type KubePrismEndpointsSpec -type KubePrismStatusesSpec -type KubeletSpecSpec -type ManifestSpec -type ManifestStatusSpec -type NodeAnnotationSpecSpec -type NodeCordonedSpecSpec -type NodeLabelSpecSpec -type NodeTaintSpecSpec -type KubeletConfigSpec -type NodeIPSpec -type NodeIPConfigSpec -type NodeStatusSpec -type NodenameSpec -type SchedulerConfigSpec -type SecretsStatusSpec -type StaticPodSpec -type StaticPodStatusSpec -type StaticPodServerStatusSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go . +//go:generate go tool github.com/siderolabs/deep-copy -type AdmissionControlConfigSpec -type APIServerConfigSpec -type AuditPolicyConfigSpec -type AuthorizationConfigSpec -type BootstrapManifestsConfigSpec -type ConfigStatusSpec -type ControllerManagerConfigSpec -type EndpointSpec -type ExtraManifestsConfigSpec -type KubeletKubeconfigSpec -type KubeletLifecycleSpec -type KubePrismConfigSpec -type KubePrismEndpointsSpec -type KubePrismStatusesSpec -type KubeletSpecSpec -type ManifestSpec -type ManifestStatusSpec -type NodeAnnotationSpecSpec -type NodeCordonedSpecSpec -type NodeLabelSpecSpec -type NodeTaintSpecSpec -type KubeletConfigSpec -type NodeIPSpec -type NodeIPConfigSpec -type NodeStatusSpec -type NodenameSpec -type SchedulerConfigSpec -type SecretsStatusSpec -type StaticPodSpec -type StaticPodStatusSpec -type StaticPodServerStatusSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go . // NamespaceName contains resources supporting Kubernetes components on all node types. const NamespaceName resource.Namespace = "k8s" diff --git a/pkg/machinery/resources/k8s/k8s_test.go b/pkg/machinery/resources/k8s/k8s_test.go index fcaf9281c..c06c4ad6b 100644 --- a/pkg/machinery/resources/k8s/k8s_test.go +++ b/pkg/machinery/resources/k8s/k8s_test.go @@ -36,6 +36,7 @@ func TestRegisterResource(t *testing.T) { &k8s.Endpoint{}, &k8s.ExtraManifestsConfig{}, &k8s.KubeletConfig{}, + &k8s.KubeletKubeconfig{}, &k8s.KubeletLifecycle{}, &k8s.KubeletSpec{}, &k8s.KubePrismStatuses{}, diff --git a/pkg/machinery/resources/k8s/kubelet_kubeconfig.go b/pkg/machinery/resources/k8s/kubelet_kubeconfig.go new file mode 100644 index 000000000..4235ced61 --- /dev/null +++ b/pkg/machinery/resources/k8s/kubelet_kubeconfig.go @@ -0,0 +1,71 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package k8s + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/talos/pkg/machinery/proto" +) + +// KubeletKubeconfigType is type of KubeletKubeconfig resource. +const KubeletKubeconfigType = resource.Type("KubeletKubeconfigs.kubernetes.talos.dev") + +// KubeletKubeconfigID is a singleton resource ID for KubeletKubeconfig. +const KubeletKubeconfigID = resource.ID("kubelet") + +// KubeletKubeconfig resource exposes the on-disk kubelet kubeconfig state so +// that consumers can detect when the file has changed and rebuild their +// Kubernetes clients (the informer's reflector doesn't bubble up +// connection-refused errors against a stale endpoint). +type KubeletKubeconfig = typed.Resource[KubeletKubeconfigSpec, KubeletKubeconfigExtension] + +// KubeletKubeconfigSpec describes the current kubelet kubeconfig file. +// +//gotagsrewrite:gen +type KubeletKubeconfigSpec struct { + // Hash is a content digest of the kubeconfig file. It changes whenever the + // file contents change, which is the signal consumers use to rebuild their + // Kubernetes clients. + Hash string `yaml:"hash" protobuf:"1"` +} + +// NewKubeletKubeconfig initializes a KubeletKubeconfig resource. +func NewKubeletKubeconfig(namespace resource.Namespace, id resource.ID) *KubeletKubeconfig { + return typed.NewResource[KubeletKubeconfigSpec, KubeletKubeconfigExtension]( + resource.NewMetadata(namespace, KubeletKubeconfigType, id, resource.VersionUndefined), + KubeletKubeconfigSpec{}, + ) +} + +// KubeletKubeconfigExtension provides auxiliary methods for KubeletKubeconfig. +type KubeletKubeconfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (KubeletKubeconfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubeletKubeconfigType, + Aliases: []resource.Type{}, + DefaultNamespace: NamespaceName, + PrintColumns: []meta.PrintColumn{ + { + Name: "Hash", + JSONPath: "{.hash}", + }, + }, + } +} + +func init() { + proto.RegisterDefaultTypes() + + err := protobuf.RegisterDynamic[KubeletKubeconfigSpec](KubeletKubeconfigType, &KubeletKubeconfig{}) + if err != nil { + panic(err) + } +} diff --git a/website/content/v1.13/reference/api.md b/website/content/v1.13/reference/api.md index 7a77030f3..c5f0d0533 100644 --- a/website/content/v1.13/reference/api.md +++ b/website/content/v1.13/reference/api.md @@ -445,6 +445,7 @@ description: Talos gRPC API reference. - [KubePrismStatusesSpec](#talos.resource.definitions.k8s.KubePrismStatusesSpec) - [KubeletConfigSpec](#talos.resource.definitions.k8s.KubeletConfigSpec) - [KubeletConfigSpec.ExtraArgsEntry](#talos.resource.definitions.k8s.KubeletConfigSpec.ExtraArgsEntry) + - [KubeletKubeconfigSpec](#talos.resource.definitions.k8s.KubeletKubeconfigSpec) - [KubeletSpecSpec](#talos.resource.definitions.k8s.KubeletSpecSpec) - [ManifestSpec](#talos.resource.definitions.k8s.ManifestSpec) - [ManifestStatusSpec](#talos.resource.definitions.k8s.ManifestStatusSpec) @@ -7884,6 +7885,21 @@ KubeletConfigSpec holds the source of kubelet configuration. + + +### KubeletKubeconfigSpec +KubeletKubeconfigSpec describes the current kubelet kubeconfig file. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hash | [string](#string) | | | + + + + + + ### KubeletSpecSpec