From b00a4b649abc0c9b9ffb38d11cc3072c5c475f69 Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 15:15:37 +0100 Subject: [PATCH 1/8] merge also node status This can be really useful to add custom resources on nodes https://kubernetes.io/docs/tasks/administer-cluster/extended-resource-node/ --- apis/labeler/v1alpha1/types.go | 4 +++- service/labeler/controller.go | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apis/labeler/v1alpha1/types.go b/apis/labeler/v1alpha1/types.go index 9bff0e6..40b4448 100644 --- a/apis/labeler/v1alpha1/types.go +++ b/apis/labeler/v1alpha1/types.go @@ -1,7 +1,7 @@ package v1alpha1 import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -41,6 +41,8 @@ type MergeSpec struct { metav1.ObjectMeta `json:",inline" protobuf:"bytes,1,opt,name=metadata"` v1.NodeSpec `json:",inline" protobuf:"bytes,2,opt,name=spec"` + + v1.NodeStatus `json:",inline" protobuf:"bytes,2,opt,name=status` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/service/labeler/controller.go b/service/labeler/controller.go index d992f83..77e0f86 100644 --- a/service/labeler/controller.go +++ b/service/labeler/controller.go @@ -121,6 +121,10 @@ func (lc *LabelController) run() error { lc.logger.Infof("merge error: %v", err) } + if err := mergo.Merge(&dst.Status, lc.l.Spec.Merge.NodeStatus, mergo.WithOverride); err != nil { + lc.logger.Infof("merge error: %v", err) + } + if reflect.DeepEqual(dst, node) { lc.logger.Infof("Node unchanged") return nil From f8ab834c824cc91c87a55f0d5f4e4224f8c4c777 Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 15:19:57 +0100 Subject: [PATCH 2/8] add capacity example --- manifest-examples/minikube.yaml | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/manifest-examples/minikube.yaml b/manifest-examples/minikube.yaml index 47f2ec6..0c4dd4c 100644 --- a/manifest-examples/minikube.yaml +++ b/manifest-examples/minikube.yaml @@ -6,24 +6,27 @@ metadata: operator: node-labeler-operator spec: nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/hostname - operator: In - values: - - minikube - - key: beta.kubernetes.io/os - operator: In - values: - - linux - - matchExpressions: - - key: another-node-label-key - operator: Exists + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: + - minikube + - key: beta.kubernetes.io/os + operator: In + values: + - linux + - matchExpressions: + - key: another-node-label-key + operator: Exists merge: labels: minikube: "true" annotations: node-labeler-operator: works taints: - - key: dedicated - value: foo - effect: PreferNoSchedule + - key: dedicated + value: foo + effect: PreferNoSchedule + capacity: + example.com/dongle: "4" + example.com/token: "1" From c4471673838a7cb9cd13c7e230069b1f4d7ae031 Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 15:53:02 +0100 Subject: [PATCH 3/8] use nodespec and fix "unchanged" notification --- apis/labeler/v1alpha1/types.go | 12 +++++----- .../labeler/v1alpha1/zz_generated.deepcopy.go | 19 +--------------- service/labeler/controller.go | 22 ++++++++++++++----- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/apis/labeler/v1alpha1/types.go b/apis/labeler/v1alpha1/types.go index 40b4448..2eda899 100644 --- a/apis/labeler/v1alpha1/types.go +++ b/apis/labeler/v1alpha1/types.go @@ -31,19 +31,19 @@ type LabelerSpec struct { // Size is how many nodes to label. //Size int `json:"Size,omitempty"` // TerminationPercent is the percent of pods that will be killed randomly. - Merge MergeSpec `json:"merge,omitempty"` + Merge v1.Node `json:"merge,omitempty"` // DryRun will set the killing in dryrun mode or not. // +optional DryRun bool `json:"dryRun,omitempty"` } -type MergeSpec struct { - metav1.ObjectMeta `json:",inline" protobuf:"bytes,1,opt,name=metadata"` +// type MergeSpec struct { +// metav1.ObjectMeta `json:",inline" protobuf:"bytes,1,opt,name=metadata"` - v1.NodeSpec `json:",inline" protobuf:"bytes,2,opt,name=spec"` +// Spec v1.NodeSpec `json:",inline" protobuf:"bytes,2,opt,name=spec"` - v1.NodeStatus `json:",inline" protobuf:"bytes,2,opt,name=status` -} +// Status v1.NodeStatus `json:",inline" protobuf:"bytes,2,opt,name=status` +// } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/apis/labeler/v1alpha1/zz_generated.deepcopy.go b/apis/labeler/v1alpha1/zz_generated.deepcopy.go index 9e9fd51..59c16f9 100644 --- a/apis/labeler/v1alpha1/zz_generated.deepcopy.go +++ b/apis/labeler/v1alpha1/zz_generated.deepcopy.go @@ -73,7 +73,7 @@ func (in *LabelerList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LabelerSpec) DeepCopyInto(out *LabelerSpec) { *out = *in - in.Merge.DeepCopyInto(&out.Merge) + out.Merge = *in.Merge.DeepCopy() return } @@ -86,20 +86,3 @@ func (in *LabelerSpec) DeepCopy() *LabelerSpec { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MergeSpec) DeepCopyInto(out *MergeSpec) { - *out = *in - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MergeSpec. -func (in *MergeSpec) DeepCopy() *MergeSpec { - if in == nil { - return nil - } - out := new(MergeSpec) - in.DeepCopyInto(out) - return out -} diff --git a/service/labeler/controller.go b/service/labeler/controller.go index 77e0f86..b40a603 100644 --- a/service/labeler/controller.go +++ b/service/labeler/controller.go @@ -117,21 +117,31 @@ func (lc *LabelController) run() error { lc.logger.Infof("merge error: %v", err) } - if err := mergo.Merge(&dst.Spec, lc.l.Spec.Merge.NodeSpec, mergo.WithOverride); err != nil { + if err := mergo.Merge(&dst.Spec, lc.l.Spec.Merge.Spec, mergo.WithOverride); err != nil { lc.logger.Infof("merge error: %v", err) } - if err := mergo.Merge(&dst.Status, lc.l.Spec.Merge.NodeStatus, mergo.WithOverride); err != nil { - lc.logger.Infof("merge error: %v", err) - } + // if err := mergo.Merge(&dst.Status, lc.l.Spec.Merge.Status, mergo.WithOverride); err != nil { + // lc.logger.Infof("merge error: %v", err) + // } if reflect.DeepEqual(dst, node) { lc.logger.Infof("Node unchanged") return nil } - _, err := lc.k8sCli.CoreV1().Nodes().Update(dst) + + dstupd, err := lc.k8sCli.CoreV1().Nodes().Update(dst) + if err != nil { + lc.logger.Infof("Error updating node meta and spec") + } + + if reflect.DeepEqual(dst, dstupd) { + lc.logger.Infof("Node unchanged") + return nil + } + lc.logger.Infof("Node updated") - return err + return nil }, DeleteFunc: func(s string) error { // log.Infof("Node deleted: %s", s) From 15aa341e6b1f37ad43c15f602c4a8c2713574aae Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 16:05:21 +0100 Subject: [PATCH 4/8] Add status update --- service/labeler/controller.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/service/labeler/controller.go b/service/labeler/controller.go index b40a603..11ce19c 100644 --- a/service/labeler/controller.go +++ b/service/labeler/controller.go @@ -121,19 +121,23 @@ func (lc *LabelController) run() error { lc.logger.Infof("merge error: %v", err) } - // if err := mergo.Merge(&dst.Status, lc.l.Spec.Merge.Status, mergo.WithOverride); err != nil { - // lc.logger.Infof("merge error: %v", err) - // } + if err := mergo.Merge(&dst.Status, lc.l.Spec.Merge.Status, mergo.WithOverride); err != nil { + lc.logger.Infof("merge error: %v", err) + } if reflect.DeepEqual(dst, node) { lc.logger.Infof("Node unchanged") return nil } - dstupd, err := lc.k8sCli.CoreV1().Nodes().Update(dst) + _, err := lc.k8sCli.CoreV1().Nodes().Update(dst) if err != nil { lc.logger.Infof("Error updating node meta and spec") } + dstupd, err := lc.k8sCli.CoreV1().Nodes().UpdateStatus(dst) + if err != nil { + lc.logger.Infof("Error updating node status") + } if reflect.DeepEqual(dst, dstupd) { lc.logger.Infof("Node unchanged") From 46df44491c988381ec43bb11d559e3eec4ca5924 Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 16:05:34 +0100 Subject: [PATCH 5/8] Fix examples --- manifest-examples/microk8s.yaml | 28 ++++++++++++++++++++++++++++ manifest-examples/minikube.yaml | 25 ++++++++++++++----------- 2 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 manifest-examples/microk8s.yaml diff --git a/manifest-examples/microk8s.yaml b/manifest-examples/microk8s.yaml new file mode 100644 index 0000000..9667569 --- /dev/null +++ b/manifest-examples/microk8s.yaml @@ -0,0 +1,28 @@ +apiVersion: labeler.barpilot.io/v1alpha1 +kind: Labeler +metadata: + name: example + labels: + operator: node-labeler-operator +spec: + nodeSelectorTerms: + - matchExpressions: + - key: beta.kubernetes.io/os + operator: In + values: + - linux + merge: + metadata: + labels: + microk8s: "true" + annotations: + node-labeler-operator: works + spec: + taints: + - key: dedicated + value: foo + effect: PreferNoSchedule + status: + capacity: + example.com/dongle: "4" + example.com/token: "1" diff --git a/manifest-examples/minikube.yaml b/manifest-examples/minikube.yaml index 0c4dd4c..9013e02 100644 --- a/manifest-examples/minikube.yaml +++ b/manifest-examples/minikube.yaml @@ -19,14 +19,17 @@ spec: - key: another-node-label-key operator: Exists merge: - labels: - minikube: "true" - annotations: - node-labeler-operator: works - taints: - - key: dedicated - value: foo - effect: PreferNoSchedule - capacity: - example.com/dongle: "4" - example.com/token: "1" + metadata: + labels: + minikube: "true" + annotations: + node-labeler-operator: works + spec: + taints: + - key: dedicated + value: foo + effect: PreferNoSchedule + status: + capacity: + example.com/dongle: "4" + example.com/token: "1" From 3796073a32e9377345bb3bfc9a1bea2aa9397366 Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 16:32:04 +0100 Subject: [PATCH 6/8] Update logs --- service/labeler/controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/labeler/controller.go b/service/labeler/controller.go index 11ce19c..de3e779 100644 --- a/service/labeler/controller.go +++ b/service/labeler/controller.go @@ -141,10 +141,10 @@ func (lc *LabelController) run() error { if reflect.DeepEqual(dst, dstupd) { lc.logger.Infof("Node unchanged") - return nil + } else { + lc.logger.Infof("Node updated") } - lc.logger.Infof("Node updated") return nil }, DeleteFunc: func(s string) error { From 5ea776c12916f0569cfc2c21d941a62cc9a43b9f Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 16:32:19 +0100 Subject: [PATCH 7/8] Remove useless code --- apis/labeler/v1alpha1/types.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apis/labeler/v1alpha1/types.go b/apis/labeler/v1alpha1/types.go index 2eda899..91cd597 100644 --- a/apis/labeler/v1alpha1/types.go +++ b/apis/labeler/v1alpha1/types.go @@ -37,14 +37,6 @@ type LabelerSpec struct { DryRun bool `json:"dryRun,omitempty"` } -// type MergeSpec struct { -// metav1.ObjectMeta `json:",inline" protobuf:"bytes,1,opt,name=metadata"` - -// Spec v1.NodeSpec `json:",inline" protobuf:"bytes,2,opt,name=spec"` - -// Status v1.NodeStatus `json:",inline" protobuf:"bytes,2,opt,name=status` -// } - // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // LabelerList is a list of Labeler resources From 682f01f9a8d2cbccff62665775b1533b21000a05 Mon Sep 17 00:00:00 2001 From: Guilhem Lettron Date: Tue, 19 Feb 2019 16:32:46 +0100 Subject: [PATCH 8/8] Update example in README --- README.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f542150..30fbb5f 100644 --- a/README.md +++ b/README.md @@ -47,14 +47,20 @@ spec: - key: another-node-label-key operator: Exists merge: - labels: - minikube: "true" - annotations: - node-labeler-operator: works - taints: - - key: dedicated - value: foo - effect: PreferNoSchedule + metadata: + labels: + mylabel: "true" + annotations: + node-labeler-operator: works + spec: + taints: + - key: dedicated + value: foo + effect: PreferNoSchedule + status: + capacity: + example.com/dongle: "4" + example.com/token: "1" ``` for more information about `nodeSelectorTerms` have a look at: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ @@ -69,5 +75,6 @@ Nodes are removed on shutdown and so lose theirs attributes. - [x] Labels - [x] Annotations - [x] Taints + - [x] Status - [ ] Removing attributes - [ ] Overwrite attributes