Skip to content

Commit

Permalink
fix node provider race condition
Browse files Browse the repository at this point in the history
  • Loading branch information
aleoli committed Jun 18, 2021
1 parent c891f0a commit 329cc7a
Show file tree
Hide file tree
Showing 7 changed files with 273 additions and 152 deletions.
3 changes: 2 additions & 1 deletion cmd/virtual-kubelet/root/root.go
Expand Up @@ -162,7 +162,8 @@ func runRootCommand(ctx context.Context, s *provider.Store, c *Opts) error {
networkReadyChan := liqoProvider.GetNetworkReadyChan()

liqoNodeProvider, err := liqonodeprovider.NewLiqoNodeProvider(c.NodeName, advName, c.ForeignClusterId,
c.KubeletNamespace, podProviderStopper, networkReadyChan, nil, c.LiqoInformerResyncPeriod, c.UseNewAuth)
c.KubeletNamespace, pNode, podProviderStopper, networkReadyChan, nil, c.LiqoInformerResyncPeriod,
c.UseNewAuth)
if err != nil {
klog.Fatal(err)
}
Expand Down
20 changes: 20 additions & 0 deletions pkg/utils/maps.go
@@ -0,0 +1,20 @@
package utils

// MergeMaps merges two maps.
func MergeMaps(m1, m2 map[string]string) map[string]string {
if m1 == nil {
return m2
}
for k, v := range m2 {
m1[k] = v
}
return m1
}

// SubMaps removes elements of m2 from m1.
func SubMaps(m1, m2 map[string]string) map[string]string {
for k := range m2 {
delete(m1, k)
}
return m1
}
3 changes: 3 additions & 0 deletions pkg/virtualKubelet/liqoNodeProvider/nodeProvider.go
Expand Up @@ -15,6 +15,9 @@ type LiqoNodeProvider struct {
client kubernetes.Interface
dynClient dynamic.Interface

node *corev1.Node
oldLabels map[string]string

nodeName string
advName string
foreignClusterID string
Expand Down
77 changes: 75 additions & 2 deletions pkg/virtualKubelet/liqoNodeProvider/nodeProvider_test.go
Expand Up @@ -10,10 +10,12 @@ import (
. "github.com/onsi/ginkgo/extensions/table"
. "github.com/onsi/gomega"
v1 "k8s.io/api/core/v1"

"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"

Expand Down Expand Up @@ -65,14 +67,14 @@ var _ = Describe("NodeProvider", func() {
Name: nodeName,
},
}
_, err = client.CoreV1().Nodes().Create(ctx, node, metav1.CreateOptions{})
node, err = client.CoreV1().Nodes().Create(ctx, node, metav1.CreateOptions{})
Expect(err).To(BeNil())

podStopper = make(chan struct{}, 1)
networkStopper = make(chan struct{}, 1)
nodeChan = make(chan *v1.Node, 10)

nodeProvider, err = NewLiqoNodeProvider(nodeName, advName, foreignClusterID, kubeletNamespace, podStopper, networkStopper, cluster.GetCfg(), 0, false)
nodeProvider, err = NewLiqoNodeProvider(nodeName, advName, foreignClusterID, kubeletNamespace, node, podStopper, networkStopper, cluster.GetCfg(), 0, false)
Expect(err).To(BeNil())

nodeProvider.NotifyNodeStatus(ctx, func(node *v1.Node) {
Expand Down Expand Up @@ -309,4 +311,75 @@ var _ = Describe("NodeProvider", func() {
}),
)

It("Labels patch", func() {

By("Add labels")

labels := map[string]string{
"test1": "value1",
"test2": "value2",
}

patch, err := nodeProvider.getLabelsPatch(labels)
Expect(err).ToNot(HaveOccurred())
Expect(patch).ToNot(BeNil())

client := kubernetes.NewForConfigOrDie(cluster.GetCfg())
node, err := client.CoreV1().Nodes().Patch(context.TODO(),
nodeName, types.JSONPatchType, patch, metav1.PatchOptions{})
Expect(err).ToNot(HaveOccurred())

nodeLabels := node.GetLabels()
v, ok := nodeLabels["test1"]
Expect(ok).To(BeTrue())
Expect(v).To(Equal("value1"))
v, ok = nodeLabels["test2"]
Expect(ok).To(BeTrue())
Expect(v).To(Equal("value2"))

By("Update labels")

labels = map[string]string{
"test1": "value3",
"test2": "value4",
}

patch, err = nodeProvider.getLabelsPatch(labels)
Expect(err).ToNot(HaveOccurred())
Expect(patch).ToNot(BeNil())

node, err = client.CoreV1().Nodes().Patch(context.TODO(),
nodeName, types.JSONPatchType, patch, metav1.PatchOptions{})
Expect(err).ToNot(HaveOccurred())

nodeLabels = node.GetLabels()
v, ok = nodeLabels["test1"]
Expect(ok).To(BeTrue())
Expect(v).To(Equal("value3"))
v, ok = nodeLabels["test2"]
Expect(ok).To(BeTrue())
Expect(v).To(Equal("value4"))

By("Delete labels")

labels = map[string]string{
"test1": "value3",
}

patch, err = nodeProvider.getLabelsPatch(labels)
Expect(err).ToNot(HaveOccurred())
Expect(patch).ToNot(BeNil())

node, err = client.CoreV1().Nodes().Patch(context.TODO(),
nodeName, types.JSONPatchType, patch, metav1.PatchOptions{})
Expect(err).ToNot(HaveOccurred())

nodeLabels = node.GetLabels()
v, ok = nodeLabels["test1"]
Expect(ok).To(BeTrue())
Expect(v).To(Equal("value3"))
_, ok = nodeLabels["test2"]
Expect(ok).To(BeFalse())
})

})

0 comments on commit 329cc7a

Please sign in to comment.