Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a98d1e6
New ixia-c operator (#754)
octpetre Aug 25, 2026
1e48cfc
[KNE] pull the current meshnet into the packer img (#752)
kraney Aug 25, 2026
7aea991
Update slightly obsolete / deprecated client library references in KN…
kraney Aug 25, 2026
3f9fb4a
chore(all): update kubernetes monorepo to v0.36.4 (#748)
renovate-bot Aug 25, 2026
b08389c
chore(all): update deps (#749)
renovate-bot Aug 25, 2026
9641548
feat(deploy): update k8s to 1.36 and add cluster version pinning and …
bstoll Aug 25, 2026
d566207
fix(cloudbuild): sync host dependencies from external.pkr.hcl in pres…
bstoll Aug 25, 2026
325d72c
Shift to using dynamic.Interface for meshnet and lemming (#758)
kraney Aug 26, 2026
84591e5
Lint cleanup
bstoll Aug 26, 2026
3dece37
Update deprecated beta.kubernetes.io tag
bstoll Aug 26, 2026
e67ce4f
docs: update kind install instructions and sync meshnet kind version
bstoll Aug 26, 2026
cb5c1fe
fix(deploy): fix flaky context cancellation tests in health waiters (…
bstoll Aug 27, 2026
9bad8f5
replace more instances of clientset with dynamic client (#761)
kraney Aug 27, 2026
2c0eca3
Merge branch 'main' into update-k8s-v1.36
bstoll Aug 28, 2026
cec9b74
Fix drivenets default node services and interface count (#683)
msupinodn Aug 28, 2026
2c45a8d
Merge branch 'main' into update-k8s-v1.36
bstoll Aug 31, 2026
2405128
Migrate to lemming operator v0.2.9 (#764)
kraney Aug 31, 2026
8037fea
This PR improves error handling, certificate idempotency, and com…
manizzzz Sep 1, 2026
16bd8f7
Merge branch 'main' into update-k8s-v1.36
kraney Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/linters/.codespellrc
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
[codespell]
skip = *.pdf,*.png,*.jpg,*.gif,*.ico,*.sum,*.mod,*.pb.go,*go.sum,*/go.sum,vendor,.git
ignore-words-list = dne
2 changes: 1 addition & 1 deletion .mk/kind.mk
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ KIND_CLUSTER_NAME := "kne"

.PHONY: kind-install
kind-install:
go get sigs.k8s.io/kind@v0.11.1
go install sigs.k8s.io/kind@v0.32.0

.PHONY: kind-stop
kind-stop:
Expand Down
4 changes: 1 addition & 3 deletions api/metallb/clientset/v1beta1/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,11 @@ func L2AdvertisementGVR() schema.GroupVersionResource {
}

var (
groupVersion = metallbv1.GroupVersion
groupVersion = schema.GroupVersion{Group: "metallb.io", Version: "v1beta1"}
Scheme = runtime.NewScheme()
)

func init() {
metallbv1.AddToScheme(Scheme)

metav1.AddToGroupVersion(Scheme, groupVersion)
metav1.AddMetaToScheme(Scheme)
}
Expand Down
9 changes: 2 additions & 7 deletions api/metallb/clientset/v1beta1/ipaddresspool.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/dynamic"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
)

type addressPoolClient struct {
Expand Down Expand Up @@ -56,13 +55,9 @@ func (a *addressPoolClient) Get(ctx context.Context, name string, opts metav1.Ge
}

func (a *addressPoolClient) Create(ctx context.Context, pool *metallbv1.IPAddressPool, opts metav1.CreateOptions) (*metallbv1.IPAddressPool, error) {
gvk, err := apiutil.GVKForObject(pool, Scheme)
if err != nil {
return nil, fmt.Errorf("failed to get gvk for AddressPool: %w", err)
}
pool.TypeMeta = metav1.TypeMeta{
Kind: gvk.Kind,
APIVersion: gvk.GroupVersion().String(),
Kind: "IPAddressPool",
APIVersion: metallbv1.GroupVersion.String(),
}
obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(pool)
if err != nil {
Expand Down
9 changes: 2 additions & 7 deletions api/metallb/clientset/v1beta1/l2advertisement.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/dynamic"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
)

type l2AdvertisementClient struct {
Expand Down Expand Up @@ -56,13 +55,9 @@ func (l *l2AdvertisementClient) Get(ctx context.Context, name string, opts metav
}

func (l *l2AdvertisementClient) Create(ctx context.Context, pool *metallbv1.L2Advertisement, opts metav1.CreateOptions) (*metallbv1.L2Advertisement, error) {
gvk, err := apiutil.GVKForObject(pool, Scheme)
if err != nil {
return nil, fmt.Errorf("failed to get gvk for AddressPool: %w", err)
}
pool.TypeMeta = metav1.TypeMeta{
Kind: gvk.Kind,
APIVersion: gvk.GroupVersion().String(),
Kind: "L2Advertisement",
APIVersion: metallbv1.GroupVersion.String(),
}
obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(pool)
if err != nil {
Expand Down
6 changes: 3 additions & 3 deletions cloudbuild/external.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ build {
provisioner "shell" {
inline = [
"echo Installing kubectl...",
"curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg",
"echo \"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /\" | sudo tee /etc/apt/sources.list.d/kubernetes.list",
"curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg",
"echo \"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /\" | sudo tee /etc/apt/sources.list.d/kubernetes.list",
"sudo apt-get update",
// kube-proxy requires conntrack to route traffic, and kubeadm v1.31+ enforces it in preflight checks
"sudo apt-get install conntrack -y",
Expand Down Expand Up @@ -154,7 +154,7 @@ build {
provisioner "shell" {
inline = [
"echo Installing kind...",
"/usr/local/go/bin/go install sigs.k8s.io/kind@v0.24.0",
"/usr/local/go/bin/go install sigs.k8s.io/kind@v0.32.0",
"curl --create-dirs -o third_party/licenses/kind/LICENSE https://raw.githubusercontent.com/kubernetes-sigs/kind/main/LICENSE",
"sudo cp /home/$USER/go/bin/kind /usr/local/bin/",
"/home/$USER/go/bin/kind version",
Expand Down
7 changes: 4 additions & 3 deletions cloudbuild/internal.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ build {
"sudo docker pull us-west1-docker.pkg.dev/gep-kne/cisco/8000e:ga & pids=\"$pids $!\"",
"sudo docker pull us-west1-docker.pkg.dev/gep-kne/juniper/ncptx:ga & pids=\"$pids $!\"",
"sudo docker pull us-west1-docker.pkg.dev/gep-kne/nokia/srlinux:ga & pids=\"$pids $!\"",
"sudo docker pull us-west1-docker.pkg.dev/kne-external/kne/meshnet:ga & pids=\"$pids $!\"",
"echo 'Waiting for all docker pulls to complete...'",
"for pid in $pids; do wait \"$pid\" || exit 1; done",
"echo 'All docker images pulled successfully.'",
Expand All @@ -106,8 +107,8 @@ build {
provisioner "shell" {
inline = [
"echo Installing kubectl...",
"curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg",
"echo \"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /\" | sudo tee /etc/apt/sources.list.d/kubernetes.list",
"curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg",
"echo \"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /\" | sudo tee /etc/apt/sources.list.d/kubernetes.list",
"sudo apt-get update",
// kube-proxy requires conntrack to route traffic, and kubeadm v1.31+ enforces it in preflight checks
"sudo apt-get install conntrack -y",
Expand Down Expand Up @@ -156,7 +157,7 @@ build {
provisioner "shell" {
inline = [
"echo Installing kind...",
"/usr/local/go/bin/go install sigs.k8s.io/kind@v0.24.0",
"/usr/local/go/bin/go install sigs.k8s.io/kind@v0.32.0",
"sudo cp /home/$USER/go/bin/kind /usr/local/bin/",
"/home/$USER/go/bin/kind version",
]
Expand Down
27 changes: 25 additions & 2 deletions cloudbuild/kne_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,31 @@ go build -o kne
cli="$HOME/kne/kne_cli/kne"
popd

# Sync host dependencies with external.pkr.hcl if needed
target_kind_pkg=$(grep -o 'sigs.k8s.io/kind@v[0-9.]*' "$HOME/kne/cloudbuild/external.pkr.hcl" | head -n 1)
if [ -n "$target_kind_pkg" ]; then
target_kind_ver=$(echo "$target_kind_pkg" | grep -o 'v[0-9.]*')
current_kind_ver=$(kind version 2>/dev/null | awk '{print $2}' || true)
if [[ "$current_kind_ver" != "$target_kind_ver" && "$current_kind_ver" != "${target_kind_ver#v}" ]]; then
echo "Syncing host kind from ${current_kind_ver:-none} to $target_kind_ver..."
go install "$target_kind_pkg"
sudo cp -f "$(go env GOPATH)/bin/kind" /usr/local/bin/
fi
fi

target_repo=$(grep -o 'https://pkgs.k8s.io/core:/stable:/v[0-9.]*/deb/' "$HOME/kne/cloudbuild/external.pkr.hcl" | head -n 1)
if [ -n "$target_repo" ]; then
target_ver=$(echo "$target_repo" | grep -o 'v[0-9.]*')
current_kubeadm=$(kubeadm version -o short 2>/dev/null || true)
if [[ "$current_kubeadm" != ${target_ver}* ]]; then
echo "Syncing host kubeadm/kubelet from ${current_kubeadm:-none} to $target_ver..."
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${target_ver}/deb/Release.key" | sudo gpg --dearmor --yes -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] ${target_repo} /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update -y
sudo apt-get install -y --allow-change-held-packages --allow-downgrades kubeadm kubelet
fi
fi

# Deploy a kind cluster
pushd "$HOME"
$cli deploy kne/deploy/kne/kind-bridge.yaml --report_usage=false
Expand All @@ -50,8 +75,6 @@ cluster:
spec:
name: kne
recycle: True
version: v0.17.0
image: 'kindest/node:v1.26.0'
googleArtifactRegistries:
- us-west1-docker.pkg.dev
containerImages:
Expand Down
4 changes: 2 additions & 2 deletions cloudbuild/vendors/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ cluster:
spec:
name: kne
recycle: True
version: v0.24.0
image: kindest/node:v1.31.0
version: v0.32.0
image: kindest/node:v1.36.1
googleArtifactRegistries:
- us-west1-docker.pkg.dev
config: ../../manifests/kind/config.yaml
Expand Down
12 changes: 12 additions & 0 deletions cloudbuild/vendors_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ go build -o kne
cli="$HOME/kne/kne_cli/kne"
popd

# Sync host dependencies with external.pkr.hcl if needed
target_kind_pkg=$(grep -o 'sigs.k8s.io/kind@v[0-9.]*' "$HOME/kne/cloudbuild/external.pkr.hcl" | head -n 1)
if [ -n "$target_kind_pkg" ]; then
target_kind_ver=$(echo "$target_kind_pkg" | grep -o 'v[0-9.]*')
current_kind_ver=$(kind version 2>/dev/null | awk '{print $2}' || true)
if [[ "$current_kind_ver" != "$target_kind_ver" && "$current_kind_ver" != "${target_kind_ver#v}" ]]; then
echo "Syncing host kind from ${current_kind_ver:-none} to $target_kind_ver..."
go install "$target_kind_pkg"
sudo cp -f "$(go env GOPATH)/bin/kind" /usr/local/bin/
fi
fi

# Deploy a cluster + topo
pushd "$HOME"
$cli deploy kne/cloudbuild/vendors/deployment.yaml --report_usage=false
Expand Down
19 changes: 11 additions & 8 deletions cluster/kubeadm/kubeadm.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type InitConfigOptions struct {
TokenTTL string
ImageRepository string
ServiceNodePortRange string
KubernetesVersion string
}

type initConfiguration struct {
Expand All @@ -40,11 +41,12 @@ type bootstrapToken struct {
}

type clusterConfiguration struct {
APIVersion string `json:"apiVersion" yaml:"apiVersion"`
Kind string `json:"kind" yaml:"kind"`
ImageRepository string `json:"imageRepository,omitempty" yaml:"imageRepository,omitempty"`
Networking *networking `json:"networking,omitempty" yaml:"networking,omitempty"`
APIServer *apiServer `json:"apiServer,omitempty" yaml:"apiServer,omitempty"`
APIVersion string `json:"apiVersion" yaml:"apiVersion"`
Kind string `json:"kind" yaml:"kind"`
KubernetesVersion string `json:"kubernetesVersion,omitempty" yaml:"kubernetesVersion,omitempty"`
ImageRepository string `json:"imageRepository,omitempty" yaml:"imageRepository,omitempty"`
Networking *networking `json:"networking,omitempty" yaml:"networking,omitempty"`
APIServer *apiServer `json:"apiServer,omitempty" yaml:"apiServer,omitempty"`
}

type networking struct {
Expand Down Expand Up @@ -78,9 +80,10 @@ func CreateInitConfigFile(opts InitConfigOptions) (string, func(), error) {
}

clusterCfg := clusterConfiguration{
APIVersion: "kubeadm.k8s.io/v1beta3",
Kind: "ClusterConfiguration",
ImageRepository: opts.ImageRepository,
APIVersion: "kubeadm.k8s.io/v1beta3",
Kind: "ClusterConfiguration",
KubernetesVersion: opts.KubernetesVersion,
ImageRepository: opts.ImageRepository,
}
if opts.PodNetworkCIDR != "" {
clusterCfg.Networking = &networking{PodSubnet: opts.PodNetworkCIDR}
Expand Down
15 changes: 15 additions & 0 deletions cluster/kubeadm/kubeadm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,21 @@ func TestCreateInitConfigFile(t *testing.T) {
"podSubnet: 10.244.0.0/16",
"service-node-port-range: 20000-30000",
},
}, {
desc: "with kubernetes version",
opts: InitConfigOptions{
KubernetesVersion: "v1.35.8",
ImageRepository: "us-west1-docker.pkg.dev/kne-external/kne",
ServiceNodePortRange: "10000-32767",
},
wantInitCfg: false,
wantYAMLContains: []string{
"apiVersion: kubeadm.k8s.io/v1beta3",
"kind: ClusterConfiguration",
"kubernetesVersion: v1.35.8",
"imageRepository: us-west1-docker.pkg.dev/kne-external/kne",
"service-node-port-range: 10000-32767",
},
}}

for _, tt := range tests {
Expand Down
17 changes: 6 additions & 11 deletions cmd/topology/topology_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,17 @@ import (
"testing"

"github.com/google/go-cmp/cmp"
tfake "github.com/openconfig/kne/third_party/meshnet/api/clientset/v1beta1/fake"
"github.com/openconfig/gnmi/errdiff"
cpb "github.com/openconfig/kne/proto/controller"
tpb "github.com/openconfig/kne/proto/topo"
topologyv1 "github.com/openconfig/kne/third_party/meshnet/api/types/v1beta1"
"github.com/openconfig/kne/topo"
"github.com/openconfig/kne/topo/node"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"google.golang.org/protobuf/encoding/prototext"
"google.golang.org/protobuf/testing/protocmp"
dfake "k8s.io/client-go/dynamic/fake"
kfake "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/rest"
)
Expand Down Expand Up @@ -220,14 +221,11 @@ func TestReset(t *testing.T) {

rCmd := New()
origOpts := opts
tf, err := tfake.NewSimpleClientset()
if err != nil {
t.Fatalf("cannot create fake topology clientset")
}
tf := dfake.NewSimpleDynamicClient(topologyv1.Scheme)
opts = []topo.Option{
topo.WithClusterConfig(&rest.Config{}),
topo.WithKubeClient(kfake.NewSimpleClientset()),
topo.WithTopoClient(tf),
topo.WithDynamicClient(tf),
}
defer func() {
opts = origOpts
Expand Down Expand Up @@ -614,14 +612,11 @@ func TestPush(t *testing.T) {

rCmd := New()
origOpts := opts
tf, err := tfake.NewSimpleClientset()
if err != nil {
t.Fatalf("cannot create fake topology clientset")
}
tf := dfake.NewSimpleDynamicClient(topologyv1.Scheme)
opts = []topo.Option{
topo.WithClusterConfig(&rest.Config{}),
topo.WithKubeClient(kfake.NewSimpleClientset()),
topo.WithTopoClient(tf),
topo.WithDynamicClient(tf),
}
defer func() {
opts = origOpts
Expand Down
1 change: 1 addition & 0 deletions controller/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ func newDeployment(req *cpb.CreateClusterRequest) (*deploy.Deployment, error) {
AllowControlPlaneScheduling: req.GetKubeadm().AllowControlPlaneScheduling,
CredentialProviderConfig: req.GetKubeadm().CredentialProviderConfig,
ImageRepository: req.GetKubeadm().ImageRepository,
KubernetesVersion: req.GetKubeadm().KubernetesVersion,
}
switch t := req.GetKubeadm().GetPodNetworkAddOnManifest().GetManifestData().(type) {
case *cpb.Manifest_Data:
Expand Down
2 changes: 2 additions & 0 deletions controller/server/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ func TestNewDeployment(t *testing.T) {
AllowControlPlaneScheduling: true,
Network: "my-network",
ImageRepository: "us-west1-docker.pkg.dev/kne-external/kne",
KubernetesVersion: "v1.35.8",
},
},
IngressSpec: &cpb.CreateClusterRequest_Metallb{
Expand Down Expand Up @@ -121,6 +122,7 @@ func TestNewDeployment(t *testing.T) {
AllowControlPlaneScheduling: true,
Network: "my-network",
ImageRepository: "us-west1-docker.pkg.dev/kne-external/kne",
KubernetesVersion: "v1.35.8",
},
Ingress: &deploy.MetalLBSpec{
Manifest: testFile.Name(),
Expand Down
Loading