Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package talhelper for openSUSE:Factory checked in at 2025-02-14 19:21:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/talhelper (Old) and /work/SRC/openSUSE:Factory/.talhelper.new.8181 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "talhelper" Fri Feb 14 19:21:16 2025 rev:14 rq:1245804 version:3.0.19 Changes: -------- --- /work/SRC/openSUSE:Factory/talhelper/talhelper.changes 2025-02-07 23:12:12.775339282 +0100 +++ /work/SRC/openSUSE:Factory/.talhelper.new.8181/talhelper.changes 2025-02-14 19:21:18.503716039 +0100 @@ -1,0 +2,35 @@ +Fri Feb 14 06:40:58 UTC 2025 - opensuse_buildserv...@ojkastl.de + +- Update to version 3.0.19: + * docs: update CLI reference documentation (#856) + * chore(deps): update dependency siderolabs/talos to v1.9.4 + * chore(container): update golangci/golangci-lint docker tag to + v1.64.5 + * chore(schema): update talos-extensions.yaml JSON schema + * chore(container): update ghcr.io/siderolabs/talosctl docker tag + to v1.9.4 + * chore(container): update registry.k8s.io/kubectl docker tag to + v1.32.2 + * chore(container): update golangci/golangci-lint docker tag to + v1.64.4 + * chore(devcontainer): Swap kubectl install image to use + registry.k8s.io instead of bitnami (#848) + * chore(schema): update talos-extensions.yaml JSON schema (#850) + * chore(container): update golangci/golangci-lint docker tag to + v1.64.2 + * chore(schema): update talos-extensions.yaml JSON schema (#847) + * chore(container): update goreleaser/goreleaser docker tag to + v2.7.0 + * chore(schema): update talos-extensions.yaml JSON schema (#844) + * chore(github-action): update renovatebot/github-action action + to v41.0.13 + * chore(schema): update talconfig.yaml JSON schema (#842) + * feat(code): add test for content substitution + * feat(config): add `inlineManifests` + * feat(config): allow `machineFiles` to be not envsubst-ed + * fix(deps): update module github.com/budimanjojo/talhelper/v3 to + v3.0.18 + * feat: update Scoop for talhelper version v3.0.18 + * feat: update flake (#839) + +------------------------------------------------------------------- Old: ---- talhelper-3.0.18.obscpio New: ---- talhelper-3.0.19.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ talhelper.spec ++++++ --- /var/tmp/diff_new_pack.WCtikW/_old 2025-02-14 19:21:20.831812416 +0100 +++ /var/tmp/diff_new_pack.WCtikW/_new 2025-02-14 19:21:20.843812913 +0100 @@ -17,7 +17,7 @@ Name: talhelper -Version: 3.0.18 +Version: 3.0.19 Release: 0 Summary: Tool to help creating Talos kubernetes cluster License: BSD-3-Clause ++++++ _service ++++++ --- /var/tmp/diff_new_pack.WCtikW/_old 2025-02-14 19:21:21.063822021 +0100 +++ /var/tmp/diff_new_pack.WCtikW/_new 2025-02-14 19:21:21.087823014 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/budimanjojo/talhelper</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v3.0.18</param> + <param name="revision">v3.0.19</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.WCtikW/_old 2025-02-14 19:21:21.247829638 +0100 +++ /var/tmp/diff_new_pack.WCtikW/_new 2025-02-14 19:21:21.279830963 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/budimanjojo/talhelper</param> - <param name="changesrevision">9485b27b38a26949dc95f111f9fa028ca3b3e002</param></service></servicedata> + <param name="changesrevision">7ec1c27cf88400d73cbcabab5c22e50e72413daf</param></service></servicedata> (No newline at EOF) ++++++ talhelper-3.0.18.obscpio -> talhelper-3.0.19.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/.devcontainer/Dockerfile new/talhelper-3.0.19/.devcontainer/Dockerfile --- old/talhelper-3.0.18/.devcontainer/Dockerfile 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/.devcontainer/Dockerfile 2025-02-14 04:38:18.000000000 +0100 @@ -1,16 +1,16 @@ ## ================================================================================================ # Utility versions ## ================================================================================================ -ARG KUBECTL_VERSION=1.32.1 -ARG TALOSCTL_VERSION=v1.9.3 -ARG GOLINT_VERSION=v1.63.4-alpine -ARG GORELEASER_VERSION=v2.6.1 +ARG KUBECTL_VERSION=v1.32.2 +ARG TALOSCTL_VERSION=v1.9.4 +ARG GOLINT_VERSION=v1.64.5-alpine +ARG GORELEASER_VERSION=v2.7.0 ARG SOPS_VERSION=v3.9.4-alpine ARG AGE_VERSION=v1.2.0 ARG AGE_KEYGEN_VERSION=V1.2.0 -FROM bitnami/kubectl:${KUBECTL_VERSION} AS kubectl +FROM registry.k8s.io/kubectl:${KUBECTL_VERSION} AS kubectl FROM ghcr.io/siderolabs/talosctl:${TALOSCTL_VERSION} AS talosctl FROM golangci/golangci-lint:${GOLINT_VERSION} AS golangci-lint FROM goreleaser/goreleaser:${GORELEASER_VERSION} AS goreleaser @@ -24,7 +24,7 @@ ## ================================================================================================ FROM mcr.microsoft.com/devcontainers/go:1.23-bookworm@sha256:a417a341a2a8648db7bf8527b86364848362a2c8dc150993c8a4cc2b53b4ec47 AS workspace -COPY --from=kubectl /opt/bitnami/kubectl/bin/kubectl /usr/local/bin/kubectl +COPY --from=kubectl /bin/kubectl /usr/local/bin/kubectl COPY --from=talosctl /talosctl /usr/local/bin/talosctl COPY --from=golangci-lint /usr/bin/golangci-lint /usr/local/bin/golangci-lint COPY --from=goreleaser /usr/bin/goreleaser /usr/local/bin/goreleaser @@ -38,4 +38,4 @@ RUN goreleaser completion bash | sudo tee /etc/bash_completion.d/goreleaser.bash > /dev/null USER vscode -ENTRYPOINT [ "/bin/bash", "-l", "-c" ] \ No newline at end of file +ENTRYPOINT [ "/bin/bash", "-l", "-c" ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/.github/workflows/renovate.yaml new/talhelper-3.0.19/.github/workflows/renovate.yaml --- old/talhelper-3.0.18/.github/workflows/renovate.yaml 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/.github/workflows/renovate.yaml 2025-02-14 04:38:18.000000000 +0100 @@ -38,7 +38,7 @@ echo "RENOVATE_DRY_RUN=${{ github.event.inputs.dryRun || env.RENOVATE_DRY_RUN }}" >> "${GITHUB_ENV}" echo "LOG_LEVEL=${{ github.event.inputs.logLevel || env.LOG_LEVEL }}" >> "${GITHUB_ENV}" - name: Renovate - uses: renovatebot/github-action@v41.0.12 + uses: renovatebot/github-action@v41.0.13 with: configurationFile: "${{ env.RENOVATE_CONFIG_FILE }}" token: "${{ steps.generate-token.outputs.token }}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/default.nix new/talhelper-3.0.19/default.nix --- old/talhelper-3.0.18/default.nix 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/default.nix 2025-02-14 04:38:18.000000000 +0100 @@ -8,16 +8,16 @@ buildGo123Module rec { pname = "talhelper"; - version = "3.0.17"; + version = "3.0.18"; src = fetchFromGitHub { owner = "budimanjojo"; repo = pname; rev = "v${version}"; - sha256 = "sha256-oQ3vfNXvrRre3cSDcd3OzTZeMOCCZcU6PHQuK3FevEM="; + sha256 = "sha256-h5g3ybS7nR3TdtMkE/UpCR5XmZdhL6gHum8EQ3rqpNc="; }; - vendorHash = "sha256-YvYmhrNkA5smskO2LR/iZpa8wi8s3WtfgBqsr13ExVM="; + vendorHash = "sha256-b4R4BAwczsPUEI5BqwmecFchOEt/sy/E+9bQcqGC2fY="; ldflags = [ "-s -w -X github.com/budimanjojo/talhelper/v3/cmd.version=v${version}" ]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/docs/docs/reference/cli.md new/talhelper-3.0.19/docs/docs/reference/cli.md --- old/talhelper-3.0.18/docs/docs/reference/cli.md 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/docs/docs/reference/cli.md 2025-02-14 04:38:18.000000000 +0100 @@ -525,7 +525,7 @@ --offline-mode Generate schematic ID without doing POST request to image-factory -r, --registry-url string Registry url of the image (default "factory.talos.dev") --secure-boot Whether to generate Secure Boot enabled URL - -v, --version string Talos version to generate (defaults to latest Talos version) (default "v1.9.3") + -v, --version string Talos version to generate (defaults to latest Talos version) (default "v1.9.4") ``` ### SEE ALSO @@ -558,7 +558,7 @@ --offline-mode Generate schematic ID without doing POST request to image-factory -r, --registry-url string Registry url of the image (default "factory.talos.dev") --secure-boot Whether to generate Secure Boot enabled URL - -v, --version string Talos version to generate (defaults to latest Talos version) (default "v1.9.3") + -v, --version string Talos version to generate (defaults to latest Talos version) (default "v1.9.4") ``` ### SEE ALSO @@ -581,7 +581,7 @@ --offline-mode Generate schematic ID without doing POST request to image-factory -r, --registry-url string Registry url of the image (default "factory.talos.dev") --secure-boot Whether to generate Secure Boot enabled URL - -v, --version string Talos version to generate (defaults to latest Talos version) (default "v1.9.3") + -v, --version string Talos version to generate (defaults to latest Talos version) (default "v1.9.4") ``` ### Options inherited from parent commands diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/docs/docs/reference/configuration.md new/talhelper-3.0.19/docs/docs/reference/configuration.md --- old/talhelper-3.0.18/docs/docs/reference/configuration.md 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/docs/docs/reference/configuration.md 2025-02-14 04:38:18.000000000 +0100 @@ -202,6 +202,24 @@ </tr> <tr markdown="1"> +<td markdown="1">`inlineManifests`</td> +<td markdown="1">[][InlineManifest](#inlinemanifest)</td> +<td markdown="1">A list of inline Kubernetes manifests for the cluster.</details><details><summary>*Show example*</summary> +```yaml +inlineManifests: + - name: namespace-ci + contents: |- + apiVersion: v1 + kind: Namespace + metadata: + name: ci +``` +</details></td> +<td markdown="1" align="center">`[]`</td> +<td markdown="1" align="center">:negative_squared_cross_mark:</td> +</tr> + +<tr markdown="1"> <td markdown="1">`controlPlane`</td> <td markdown="1">[NodeConfigs](#nodeconfigs)</td> <td markdown="1">Configurations targetted for all controlplane nodes.</details><details><summary>*Show example*</summary> @@ -1051,6 +1069,12 @@ `InstallDiskSelector` is type of upstream Talos <a href="https://www.talos.dev/latest/reference/configuration/#installdiskselector" target="_blank">`v1alpha1.InstallDiskSelector`</a>. +## InlineManifest + +`InlineManifest` is type of upstream Talos <a href="https://www.talos.dev/latest/reference/configuration/v1alpha1/config/#Config.cluster.inlineManifests." target="_blank">`v1alpha1.ClusterInlineManifest`</a> + +In addition to this, there's also a `skipEnvsubst` key that can be set to `true` to skip doing envsubst (only for file outside of `talconfig.yaml`) + ## MachineDisk `MachineDisk` is type of upstream Talos <a href="https://www.talos.dev/latest/reference/configuration/#machinedisk" target="_blank">`v1alpha1.MachineDisk`</a> @@ -1059,6 +1083,8 @@ `MachineFile` is type of upstream Talos <a href="https://www.talos.dev/latest/reference/configuration/#machinefile" target="_blank">`v1alpha1.MachineFile`</a> +In addition to this, there's also a `skipEnvsubst` key that can be set to `true` to skip doing envsubst (only for file outside of `talconfig.yaml`) + ## InstallExtensionConfig `InstallExtensionConfig` is type of upstream Talos <a href="https://www.talos.dev/latest/reference/configuration/#installextensionconfig" target="_blank">`v1alpha1.InstallExtensionConfig`</a> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/hack/tsehelper/go.mod new/talhelper-3.0.19/hack/tsehelper/go.mod --- old/talhelper-3.0.18/hack/tsehelper/go.mod 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/hack/tsehelper/go.mod 2025-02-14 04:38:18.000000000 +0100 @@ -3,7 +3,7 @@ go 1.23.4 require ( - github.com/budimanjojo/talhelper/v3 v3.0.17 + github.com/budimanjojo/talhelper/v3 v3.0.18 github.com/google/go-containerregistry v0.20.3 github.com/sirupsen/logrus v1.9.3 gopkg.in/yaml.v3 v3.0.1 @@ -23,7 +23,7 @@ github.com/pkg/errors v0.9.1 // indirect github.com/stretchr/testify v1.9.0 // indirect github.com/vbatts/tar-split v0.11.6 // indirect - golang.org/x/mod v0.22.0 // indirect + golang.org/x/mod v0.23.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.29.0 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/hack/tsehelper/go.sum new/talhelper-3.0.19/hack/tsehelper/go.sum --- old/talhelper-3.0.18/hack/tsehelper/go.sum 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/hack/tsehelper/go.sum 2025-02-14 04:38:18.000000000 +0100 @@ -30,6 +30,8 @@ github.com/budimanjojo/talhelper/v3 v3.0.16/go.mod h1:8Ai0qADRwTsZC2+Pqmv4C7baA6gKPA5ctSf45ASmAqo= github.com/budimanjojo/talhelper/v3 v3.0.17 h1:bA3A0WD9Yk1sL+KI+qgZkh9wc4o3vJsJSiIwkMs99lI= github.com/budimanjojo/talhelper/v3 v3.0.17/go.mod h1:Bu+yhV01RSIteHvyHg4wpGGKb05lZK9xrPKqUce1ucE= +github.com/budimanjojo/talhelper/v3 v3.0.18 h1:xk0RZrAORY2mmhATHz4x+4gtq8dKCSRyd7rnZLMs6dU= +github.com/budimanjojo/talhelper/v3 v3.0.18/go.mod h1:8VSunY2o4mQ3Ts+Y7BIL49SPUx5dy30ZIVYDpnPQOL0= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= @@ -109,6 +111,8 @@ golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/config.go new/talhelper-3.0.19/pkg/config/config.go --- old/talhelper-3.0.18/pkg/config/config.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/config.go 2025-02-14 04:38:18.000000000 +0100 @@ -10,23 +10,24 @@ ) type TalhelperConfig struct { - ClusterName string `yaml:"clusterName" jsonschema:"required,description=Name of the cluster"` - TalosVersion string `yaml:"talosVersion,omitempty" jsonschema:"example=v1.5.4,description=Talos version to perform installation"` - KubernetesVersion string `yaml:"kubernetesVersion,omitempty" jsonschema:"example=v1.27.0,description=Kubernetes version to use"` - Endpoint string `yaml:"endpoint" jsonschema:"required,example=https://192.168.200.10:6443,description=Cluster's controlplane endpoint"` - Domain string `yaml:"domain,omitempty" jsonschema:"example=cluster.local,description=The domain to be used by Kubernetes DNS"` - AllowSchedulingOnMasters bool `yaml:"allowSchedulingOnMasters,omitempty" jsonschema:"description=Whether to allow running workload on controlplane nodes"` - AllowSchedulingOnControlPlanes bool `yaml:"allowSchedulingOnControlPlanes,omitempty" jsonschema:"description=Whether to allow running workload on controlplane nodes. It is an alias to \"AllowSchedulingOnMasters\""` - AdditionalMachineCertSans []string `yaml:"additionalMachineCertSans,omitempty" jsonschema:"description=Extra certificate SANs for the machine's certificate"` - AdditionalApiServerCertSans []string `yaml:"additionalApiServerCertSans,omitempty" jsonschema:"description=Extra certificate SANs for the API server's certificate"` - ClusterPodNets []string `yaml:"clusterPodNets,omitempty" jsonschema:"description=The pod subnet CIDR list"` - ClusterSvcNets []string `yaml:"clusterSvcNets,omitempty" jsonschema:"description=The service subnet CIDR list"` - CNIConfig *v1alpha1.CNIConfig `yaml:"cniConfig,omitempty" jsonschema:"description=The CNI to be used for the cluster's network"` - Patches []string `yaml:"patches,omitempty" jsonschema:"description=Patches to be applied to all nodes"` - Nodes []Node `yaml:"nodes" jsonschema:"required,description=List of configurations for Node"` - ImageFactory ImageFactory `yaml:"imageFactory,omitempty" jsonschema:"Configuration for image factory"` - ControlPlane NodeConfigs `yaml:"controlPlane,omitempty" jsonschema:"description=Configurations targetted for all controlplane nodes"` - Worker NodeConfigs `yaml:"worker,omitempty" jsonschema:"description=Configurations targetted for all worker nodes"` + ClusterName string `yaml:"clusterName" jsonschema:"required,description=Name of the cluster"` + TalosVersion string `yaml:"talosVersion,omitempty" jsonschema:"example=v1.5.4,description=Talos version to perform installation"` + KubernetesVersion string `yaml:"kubernetesVersion,omitempty" jsonschema:"example=v1.27.0,description=Kubernetes version to use"` + Endpoint string `yaml:"endpoint" jsonschema:"required,example=https://192.168.200.10:6443,description=Cluster's controlplane endpoint"` + Domain string `yaml:"domain,omitempty" jsonschema:"example=cluster.local,description=The domain to be used by Kubernetes DNS"` + AllowSchedulingOnMasters bool `yaml:"allowSchedulingOnMasters,omitempty" jsonschema:"description=Whether to allow running workload on controlplane nodes"` + AllowSchedulingOnControlPlanes bool `yaml:"allowSchedulingOnControlPlanes,omitempty" jsonschema:"description=Whether to allow running workload on controlplane nodes. It is an alias to \"AllowSchedulingOnMasters\""` + AdditionalMachineCertSans []string `yaml:"additionalMachineCertSans,omitempty" jsonschema:"description=Extra certificate SANs for the machine's certificate"` + AdditionalApiServerCertSans []string `yaml:"additionalApiServerCertSans,omitempty" jsonschema:"description=Extra certificate SANs for the API server's certificate"` + ClusterInlineManifests ClusterInlineManifests `yaml:"inlineManifests,omitempty" jsonschema:"description=A list of inline Kubernetes manifests for the cluster"` + ClusterPodNets []string `yaml:"clusterPodNets,omitempty" jsonschema:"description=The pod subnet CIDR list"` + ClusterSvcNets []string `yaml:"clusterSvcNets,omitempty" jsonschema:"description=The service subnet CIDR list"` + CNIConfig *v1alpha1.CNIConfig `yaml:"cniConfig,omitempty" jsonschema:"description=The CNI to be used for the cluster's network"` + Patches []string `yaml:"patches,omitempty" jsonschema:"description=Patches to be applied to all nodes"` + Nodes []Node `yaml:"nodes" jsonschema:"required,description=List of configurations for Node"` + ImageFactory ImageFactory `yaml:"imageFactory,omitempty" jsonschema:"Configuration for image factory"` + ControlPlane NodeConfigs `yaml:"controlPlane,omitempty" jsonschema:"description=Configurations targetted for all controlplane nodes"` + Worker NodeConfigs `yaml:"worker,omitempty" jsonschema:"description=Configurations targetted for all worker nodes"` } type Node struct { @@ -46,7 +47,7 @@ NodeAnnotations map[string]string `yaml:"nodeAnnotations" jsonschema:"description=Annotations to be added to the node, supports templating"` NodeTaints map[string]string `yaml:"nodeTaints" jsonschema:"description=Node taints for the node. Effect is optional"` MachineDisks []*v1alpha1.MachineDisk `yaml:"machineDisks,omitempty" jsonschema:"description=List of additional disks to partition, format, mount"` - MachineFiles []*v1alpha1.MachineFile `yaml:"machineFiles,omitempty" jsonschema:"description=List of files to create inside the node"` + MachineFiles MachineFiles `yaml:"machineFiles,omitempty" jsonschema:"description=List of files to create inside the node"` DisableSearchDomain bool `yaml:"disableSearchDomain,omitempty" jsonschema:"description=Whether to disable generating default search domain"` KernelModules []*v1alpha1.KernelModuleConfig `yaml:"kernelModules,omitempty" jsonschema:"description=List of additional kernel modules to load inside the node"` Nameservers []string `yaml:"nameservers,omitempty" jsonschema:"description=List of nameservers for the node"` @@ -101,3 +102,17 @@ Name string `yaml:"name" jsonschema:"description=Name of the volume config"` Provisioning block.ProvisioningSpec `yaml:"provisioning" jsonschema:"description=Provisioning spec of the volume config"` } + +type MachineFiles []*MachineFile + +type MachineFile struct { + v1alpha1.MachineFile `yaml:",inline"` + SkipEnvsubst bool `yaml:"skipEnvsubst" jsonschema:"description=Whether to skip envsubst to the contents (only for contents in another file)"` +} + +type ClusterInlineManifests []*ClusterInlineManifest + +type ClusterInlineManifest struct { + v1alpha1.ClusterInlineManifest `yaml:",inline"` + SkipEnvsubst bool `yaml:"skipEnvsubst" jsonschema:"description=Whether to skip envsubst to the contents (only for contents in another file)"` +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/defaults.go new/talhelper-3.0.19/pkg/config/defaults.go --- old/talhelper-3.0.18/pkg/config/defaults.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/defaults.go 2025-02-14 04:38:18.000000000 +0100 @@ -13,7 +13,7 @@ ) // renovate: depName=siderolabs/talos datasource=github-releases -var LatestTalosVersion = "v1.9.3" +var LatestTalosVersion = "v1.9.4" //go:embed schemas/talos-extensions.json var schemaFile []byte diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/loader.go new/talhelper-3.0.19/pkg/config/loader.go --- old/talhelper-3.0.18/pkg/config/loader.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/loader.go 2025-02-14 04:38:18.000000000 +0100 @@ -4,7 +4,6 @@ "fmt" "log/slog" "os" - "strings" "github.com/budimanjojo/talhelper/v3/pkg/substitute" "github.com/fatih/color" @@ -44,6 +43,16 @@ return nil, fmt.Errorf("failed to unmarshal config file: %s", err) } + if len(cfg.ClusterInlineManifests) > 0 { + for i, manifest := range cfg.ClusterInlineManifests { + contents, err := substitute.SubstituteFileContent(manifest.InlineManifestContents, !manifest.SkipEnvsubst) + if err != nil { + return nil, fmt.Errorf("failed to get inlineManifest content for %s in `inlineManifest[%d]`: %s", manifest.InlineManifestContents, i, err) + } + manifest.InlineManifestContents = contents + } + } + for k := range cfg.Nodes { node := &cfg.Nodes[k] @@ -58,7 +67,7 @@ if len(node.MachineFiles) > 0 { for i, file := range node.MachineFiles { - contents, err := ensureFileContent(file.FileContent) + contents, err := substitute.SubstituteFileContent(file.FileContent, !file.SkipEnvsubst) if err != nil { return nil, fmt.Errorf("failed to get machine file content for %s in `machineFiles[%d]`: %s", node.Hostname, i, err) } @@ -133,24 +142,3 @@ } return c, nil } - -func ensureFileContent(value string) (string, error) { - if strings.HasPrefix(value, "@") { - slog.Debug(fmt.Sprintf("getting file content of %s", value)) - filename := value[1:] - - contents, err := os.ReadFile(filename) - if err != nil { - return "", err - } - - substituted, err := substitute.SubstituteEnvFromByte(contents) - if err != nil { - return "", err - } - - return string(substituted), nil - } - - return value, nil -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/schemas/talconfig.json new/talhelper-3.0.19/pkg/config/schemas/talconfig.json --- old/talhelper-3.0.18/pkg/config/schemas/talconfig.json 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/schemas/talconfig.json 2025-02-14 04:38:18.000000000 +0100 @@ -161,6 +161,28 @@ "additionalProperties": false, "type": "object" }, + "ClusterInlineManifest": { + "properties": { + "name": { + "type": "string" + }, + "contents": { + "type": "string" + }, + "skipEnvsubst": { + "type": "boolean", + "description": "Whether to skip envsubst to the contents (only for contents in another file)" + } + }, + "additionalProperties": false, + "type": "object" + }, + "ClusterInlineManifests": { + "items": { + "$ref": "#/$defs/ClusterInlineManifest" + }, + "type": "array" + }, "ConfigFile": { "properties": { "content": { @@ -542,11 +564,21 @@ }, "op": { "type": "string" + }, + "skipEnvsubst": { + "type": "boolean", + "description": "Whether to skip envsubst to the contents (only for contents in another file)" } }, "additionalProperties": false, "type": "object" }, + "MachineFiles": { + "items": { + "$ref": "#/$defs/MachineFile" + }, + "type": "array" + }, "MachineSpec": { "properties": { "mode": { @@ -719,10 +751,7 @@ "description": "List of additional disks to partition" }, "machineFiles": { - "items": { - "$ref": "#/$defs/MachineFile" - }, - "type": "array", + "$ref": "#/$defs/MachineFiles", "description": "List of files to create inside the node" }, "disableSearchDomain": { @@ -844,10 +873,7 @@ "description": "List of additional disks to partition" }, "machineFiles": { - "items": { - "$ref": "#/$defs/MachineFile" - }, - "type": "array", + "$ref": "#/$defs/MachineFiles", "description": "List of files to create inside the node" }, "disableSearchDomain": { @@ -1101,6 +1127,10 @@ "type": "array", "description": "Extra certificate SANs for the API server's certificate" }, + "inlineManifests": { + "$ref": "#/$defs/ClusterInlineManifests", + "description": "A list of inline Kubernetes manifests for the cluster" + }, "clusterPodNets": { "items": { "type": "string" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/schemas/talos-extensions.json new/talhelper-3.0.19/pkg/config/schemas/talos-extensions.json --- old/talhelper-3.0.18/pkg/config/schemas/talos-extensions.json 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/schemas/talos-extensions.json 2025-02-14 04:38:18.000000000 +0100 @@ -14653,6 +14653,177 @@ ] }, { + "version": "v1.9.3-5-g6b92401", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.9.3-6-g9ee2ba4", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.9.3-7-g5eec54c", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { "version": "v1.9.3", "systemExtensions": [ "siderolabs/amdgpu", @@ -14796,6 +14967,149 @@ ] }, { + "version": "v1.9.4", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": [ + { + "image": "siderolabs/sbc-raspberrypi", + "name": "rpi_generic", + "digest": "sha256:b1fe0c2906d2b35e7bc15194a272ef0820239a27b24d8d9f0ebdc286c20ee314" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "rockpi4", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "rockpi4c", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "rock4cplus", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "rock4se", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "nanopi-r4s", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "nanopi-r5s", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "rock64", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "orangepi-5", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "orangepi-r1-plus-lts", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "helios64", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "turingrk1", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-rockchip", + "name": "rock5b", + "digest": "sha256:6985a25afad4c6c0010d199c15d4fe75ff42b5d31777d28462819ff4a8fbfced" + }, + { + "image": "siderolabs/sbc-jetson", + "name": "jetson_nano", + "digest": "sha256:b76664e87a7ddbaad4dfe1973b3d3d212a2c67d2a3fa587e840453387720ab4e" + }, + { + "image": "siderolabs/sbc-allwinner", + "name": "bananapi_m64", + "digest": "sha256:89bd0565cdd113c790a491889cd355bdad6580cc7f30aeb44694730f703e6f67" + }, + { + "image": "siderolabs/sbc-allwinner", + "name": "libretech_all_h3_cc_h5", + "digest": "sha256:89bd0565cdd113c790a491889cd355bdad6580cc7f30aeb44694730f703e6f67" + }, + { + "image": "siderolabs/sbc-allwinner", + "name": "pine64", + "digest": "sha256:89bd0565cdd113c790a491889cd355bdad6580cc7f30aeb44694730f703e6f67" + } + ] + }, + { "version": "v1.10.0-alpha.0", "systemExtensions": [ "siderolabs/amdgpu", @@ -15594,6 +15908,354 @@ "systemExtensions": [ "siderolabs/amdgpu", "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.10.0-alpha.1-2-g5cd226e", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.10.0-alpha.1-3-g8a17f71", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.10.0-alpha.1-4-ge12c495", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.10.0-alpha.1-5-gfd5b270", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.10.0-alpha.1-6-g4e31964", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/metal-agent", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/thunderbolt", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xen-guest-agent", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null + }, + { + "version": "v1.10.0-alpha.1-7-g8591d3c", + "systemExtensions": [ + "siderolabs/amdgpu", + "siderolabs/amd-ucode", "siderolabs/binfmt-misc", "siderolabs/bnx2-bnx2x", "siderolabs/btrfs", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/validate.go new/talhelper-3.0.19/pkg/config/validate.go --- old/talhelper-3.0.18/pkg/config/validate.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/validate.go 2025-02-14 04:38:18.000000000 +0100 @@ -47,6 +47,7 @@ checkDomain(c, &result) checkClusterNets(c, &result) checkCNIConfig(c, &result) + checkClusterInlineManifests(c, &result) for k, node := range c.Nodes { slog.Debug(fmt.Sprintf("validating config file for node %s", node.Hostname)) checkNodeRequiredCfg(node, k, &result) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/validator.go new/talhelper-3.0.19/pkg/config/validator.go --- old/talhelper-3.0.18/pkg/config/validator.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/validator.go 2025-02-14 04:38:18.000000000 +0100 @@ -216,6 +216,25 @@ return result } +func checkClusterInlineManifests(c TalhelperConfig, result *Errors) *Errors { + if c.ClusterInlineManifests != nil { + var messages *multierror.Error + + cims := c.ClusterInlineManifests.GetIMs() + err := cims.Validate() + messages = multierror.Append(messages, err) + + if messages.ErrorOrNil() != nil { + return result.Append(&Error{ + Kind: "InvalidClusterInlineManifests", + Field: getFieldYamlTag(c, "inlineManifests"), + Message: formatError(messages), + }) + } + } + return result +} + func checkNodeRequiredCfg(node Node, idx int, result *Errors) *Errors { if node.Hostname == "" { e := &Error{ @@ -371,11 +390,12 @@ func checkNodeMachineFiles(node Node, idx int, result *Errors) *Errors { if node.MachineFiles != nil { + mfs := node.MachineFiles.GetMFs() var messages *multierror.Error pattern := `^create$|^append$|^overwrite$` re := regexp.MustCompile(pattern) - for _, file := range node.MachineFiles { + for _, file := range mfs { if !re.MatchString(file.FileOp) { messages = multierror.Append(messages, fmt.Errorf("%q is not a valid operation name (create,append,overwrite)", file.Op())) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/config/wrapper.go new/talhelper-3.0.19/pkg/config/wrapper.go --- old/talhelper-3.0.18/pkg/config/wrapper.go 1970-01-01 01:00:00.000000000 +0100 +++ new/talhelper-3.0.19/pkg/config/wrapper.go 2025-02-14 04:38:18.000000000 +0100 @@ -0,0 +1,23 @@ +package config + +import ( + "github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1" +) + +func (mfs MachineFiles) GetMFs() []*v1alpha1.MachineFile { + result := make([]*v1alpha1.MachineFile, 0, len(mfs)) + + for _, mf := range mfs { + result = append(result, &mf.MachineFile) + } + return result +} + +func (cims ClusterInlineManifests) GetIMs() *v1alpha1.ClusterInlineManifests { + result := make(v1alpha1.ClusterInlineManifests, 0, len(cims)) + + for _, im := range cims { + result = append(result, im.ClusterInlineManifest) + } + return &result +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/generate/config.go new/talhelper-3.0.19/pkg/generate/config.go --- old/talhelper-3.0.18/pkg/generate/config.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/generate/config.go 2025-02-14 04:38:18.000000000 +0100 @@ -14,6 +14,7 @@ "github.com/budimanjojo/talhelper/v3/pkg/config" "github.com/budimanjojo/talhelper/v3/pkg/patcher" "github.com/budimanjojo/talhelper/v3/pkg/talos" + taloscfg "github.com/siderolabs/talos/pkg/machinery/config" ) // GenerateConfig takes `TalhelperConfig` and path to encrypted `secretFile` and generates @@ -26,13 +27,23 @@ } for _, node := range c.Nodes { - var cfg []byte + var rawcfg taloscfg.Provider fileName := c.ClusterName + "-" + node.Hostname + ".yaml" cfgFile := outDir + "/" + fileName slog.Debug(fmt.Sprintf("generating %s for node %s", cfgFile, node.Hostname)) - cfg, err = talos.GenerateNodeConfigBytes(&node, input, c.GetImageFactory(), offlineMode) + rawcfg, err = talos.GenerateNodeConfig(&node, input, c.GetImageFactory(), offlineMode) + if err != nil { + return err + } + + // this is needed because the upstream cluster input doesn't handle inline manifests and some others so we need to do it ourselves + if len(c.ClusterInlineManifests) > 0 { + rawcfg.RawV1Alpha1().ClusterConfig.ClusterInlineManifests = *c.ClusterInlineManifests.GetIMs() + } + + cfg, err := rawcfg.Bytes() if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/substitute/contentsubst.go new/talhelper-3.0.19/pkg/substitute/contentsubst.go --- old/talhelper-3.0.18/pkg/substitute/contentsubst.go 1970-01-01 01:00:00.000000000 +0100 +++ new/talhelper-3.0.19/pkg/substitute/contentsubst.go 2025-02-14 04:38:18.000000000 +0100 @@ -0,0 +1,36 @@ +package substitute + +import ( + "fmt" + "log/slog" + "os" + "strings" +) + +// SubstituteFileContent will read and return the content of a file if `value` is string prefixed with `@` +// followed by a path. Otherwise the value will be returned as it is. +// The content will also be envsubst-ed if `envsubst` is `true`. +// It will also returns an error, if any. +func SubstituteFileContent(value string, envsubst bool) (string, error) { + if strings.HasPrefix(value, "@") { + slog.Debug(fmt.Sprintf("getting file content of %s", value)) + filename := value[1:] + + contents, err := os.ReadFile(filename) + if err != nil { + return "", err + } + + if envsubst { + substituted, err := SubstituteEnvFromByte(contents) + if err != nil { + return "", err + } + return string(substituted), nil + } + + return string(contents), nil + } + + return value, nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/substitute/contentsubst_test.go new/talhelper-3.0.19/pkg/substitute/contentsubst_test.go --- old/talhelper-3.0.18/pkg/substitute/contentsubst_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/talhelper-3.0.19/pkg/substitute/contentsubst_test.go 2025-02-14 04:38:18.000000000 +0100 @@ -0,0 +1,69 @@ +package substitute + +import ( + "os" + "strings" + "testing" +) + +func TestSubstituteFileContent(t *testing.T) { + contents := []string{ + "@./testdata/content.yaml", + "this is $host", + } + envs := map[string]string{ + "host": "substhost", + "remote_addr": "substremote_addr", + "request_method": "substrequest_method", + "uri": "substuri", + } + + for env, value := range envs { + os.Setenv(env, value) + } + + expectedWithoutEnvsubst := []string{ + `--- +# Source: cilium/templates/hubble-ui/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: hubble-ui-nginx + namespace: kube-system +data: + nginx.conf: "server {\n listen 8081;\n listen [::]:8081;\n server_name localhost;\n root /app;\n index index.html;\n client_max_body_size 1G;\n\n location / {\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n\n # CORS\n add_header Access-Control-Allow-Methods \"GET, POST, PUT, HEAD, DELETE, OPTIONS\";\n add_header Access-Control-Allow-Origin *;\n add_header Access-Control-Max-Age 1728000;\n add_header Access-Control-Expose-Headers content-length,grpc-status,grpc-message;\n add_header Access-Control-Allow-Headers range,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout;\n if ($request_method = OPTIONS) {\n return 204;\n }\n # /CORS\n\n location /api {\n proxy_http_version 1.1;\n proxy_p ass_request_headers on;\n proxy_hide_header Access-Control-Allow-Origin;\n proxy_pass http://127.0.0.1:8090;\n }\n location / {\n # double ` + "`" + "/index.html" + "`" + ` is required here \n try_files $uri $uri/ /index.html /index.html;\n }\n\n # Liveness probe\n location /healthz {\n access_log off;\n add_header Content-Type text/plain;\n return 200 'ok';\n }\n }\n}" +---`, + "this is $host", + } + + expectedWithEnvsubst := []string{ + `apiVersion: v1 +kind: ConfigMap +metadata: + name: hubble-ui-nginx + namespace: kube-system +data: + nginx.conf: "server {\n listen 8081;\n listen [::]:8081;\n server_name localhost;\n root /app;\n index index.html;\n client_max_body_size 1G;\n\n location / {\n proxy_set_header Host substhost;\n proxy_set_header X-Real-IP substremote_addr;\n\n # CORS\n add_header Access-Control-Allow-Methods \"GET, POST, PUT, HEAD, DELETE, OPTIONS\";\n add_header Access-Control-Allow-Origin *;\n add_header Access-Control-Max-Age 1728000;\n add_header Access-Control-Expose-Headers content-length,grpc-status,grpc-message;\n add_header Access-Control-Allow-Headers range,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout;\n if (substrequest_method = OPTIONS) {\n return 204;\n }\n # /CORS\n\n location /api {\n proxy_http_version 1.1;\n proxy_pass_request_headers on;\n proxy_hide_header Access-Control-Allow-Origin;\n proxy_pass http://127.0.0.1:8090;\n }\n location / {\n # double ` + "`" + "/index.html" + "`" + ` is required here \n try_files substuri substuri/ /index.html /index.html;\n }\n\n # Liveness probe\n location /healthz {\n access_log off;\n add_header Content-Type text/plain;\n return 200 'ok';\n }\n }\n}" +---`, // header and comments are removed by SubstituteEnvFromByte() + "this is $host", // ignored when it's not a file + } + + for k, v := range contents { + r1, err := SubstituteFileContent(v, false) + if err != nil { + t.Fatal(err) + } + + if expectedWithoutEnvsubst[k] != strings.TrimSpace(r1) { + t.Errorf("got\n%s,\bwant\n%s", strings.TrimSpace(r1), expectedWithoutEnvsubst[k]) + } + + r2, err := SubstituteFileContent(v, true) + if err != nil { + t.Fatal(err) + } + if expectedWithEnvsubst[k] != strings.TrimSpace(r2) { + t.Errorf("got\n%s,\bwant\n%s", strings.TrimSpace(r2), expectedWithEnvsubst[k]) + } + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/substitute/pathsubst.go new/talhelper-3.0.19/pkg/substitute/pathsubst.go --- old/talhelper-3.0.18/pkg/substitute/pathsubst.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/substitute/pathsubst.go 2025-02-14 04:38:18.000000000 +0100 @@ -77,7 +77,7 @@ func shouldSubstitute(path []string) bool { for _, p := range path { - if p == "machineFiles" || p == "patches" || p == "extraManifests" { + if p == "machineFiles" || p == "patches" || p == "extraManifests" || p == "inlineManifests" { return true } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/substitute/testdata/content.yaml new/talhelper-3.0.19/pkg/substitute/testdata/content.yaml --- old/talhelper-3.0.18/pkg/substitute/testdata/content.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/talhelper-3.0.19/pkg/substitute/testdata/content.yaml 2025-02-14 04:38:18.000000000 +0100 @@ -0,0 +1,10 @@ +--- +# Source: cilium/templates/hubble-ui/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: hubble-ui-nginx + namespace: kube-system +data: + nginx.conf: "server {\n listen 8081;\n listen [::]:8081;\n server_name localhost;\n root /app;\n index index.html;\n client_max_body_size 1G;\n\n location / {\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n\n # CORS\n add_header Access-Control-Allow-Methods \"GET, POST, PUT, HEAD, DELETE, OPTIONS\";\n add_header Access-Control-Allow-Origin *;\n add_header Access-Control-Max-Age 1728000;\n add_header Access-Control-Expose-Headers content-length,grpc-status,grpc-message;\n add_header Access-Control-Allow-Headers range,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout;\n if ($request_method = OPTIONS) {\n return 204;\n }\n # /CORS\n\n location /api {\n proxy_http_version 1.1;\n proxy_p ass_request_headers on;\n proxy_hide_header Access-Control-Allow-Origin;\n proxy_pass http://127.0.0.1:8090;\n }\n location / {\n # double `/index.html` is required here \n try_files $uri $uri/ /index.html /index.html;\n }\n\n # Liveness probe\n location /healthz {\n access_log off;\n add_header Content-Type text/plain;\n return 200 'ok';\n }\n }\n}" +--- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/pkg/talos/nodeconfig.go new/talhelper-3.0.19/pkg/talos/nodeconfig.go --- old/talhelper-3.0.18/pkg/talos/nodeconfig.go 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/pkg/talos/nodeconfig.go 2025-02-14 04:38:18.000000000 +0100 @@ -125,7 +125,7 @@ if len(node.MachineFiles) > 0 { slog.Debug("setting machine files") - cfg.RawV1Alpha1().MachineConfig.MachineFiles = node.MachineFiles + cfg.RawV1Alpha1().MachineConfig.MachineFiles = node.MachineFiles.GetMFs() } if node.Schematic != nil && len(node.Schematic.Customization.ExtraKernelArgs) > 0 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.0.18/talhelper.json new/talhelper-3.0.19/talhelper.json --- old/talhelper-3.0.18/talhelper.json 2025-02-06 05:08:44.000000000 +0100 +++ new/talhelper-3.0.19/talhelper.json 2025-02-14 04:38:18.000000000 +0100 @@ -1,12 +1,12 @@ { - "version": "3.0.17", + "version": "3.0.18", "architecture": { "64bit": { - "url": "https://github.com/budimanjojo/talhelper/releases/download/v3.0.17/talhelper_windows_amd64.tar.gz", + "url": "https://github.com/budimanjojo/talhelper/releases/download/v3.0.18/talhelper_windows_amd64.tar.gz", "bin": [ "talhelper.exe" ], - "hash": "3a5639fa816690d67a145fd2f736b0afc375d82f51324ec6735c86edac6fa29f" + "hash": "24d5bb120480f82cd2a1b8e88ee55cfc028cbbbf61d15da9787a2ff2131ffd91" } }, "homepage": "https://github.com/budimanjojo/talhelper", ++++++ talhelper.obsinfo ++++++ --- /var/tmp/diff_new_pack.WCtikW/_old 2025-02-14 19:21:22.023861764 +0100 +++ /var/tmp/diff_new_pack.WCtikW/_new 2025-02-14 19:21:22.051862923 +0100 @@ -1,5 +1,5 @@ name: talhelper -version: 3.0.18 -mtime: 1738814924 -commit: 9485b27b38a26949dc95f111f9fa028ca3b3e002 +version: 3.0.19 +mtime: 1739504298 +commit: 7ec1c27cf88400d73cbcabab5c22e50e72413daf ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/talhelper/vendor.tar.gz /work/SRC/openSUSE:Factory/.talhelper.new.8181/vendor.tar.gz differ: char 5, line 1