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 diff --git a/apis/labeler/v1alpha1/types.go b/apis/labeler/v1alpha1/types.go index 9bff0e6..91cd597 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" ) @@ -31,18 +31,12 @@ 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"` - - v1.NodeSpec `json:",inline" protobuf:"bytes,2,opt,name=spec"` -} - // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // LabelerList is a list of Labeler resources 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/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 47f2ec6..9013e02 100644 --- a/manifest-examples/minikube.yaml +++ b/manifest-examples/minikube.yaml @@ -6,24 +6,30 @@ 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 + 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" diff --git a/service/labeler/controller.go b/service/labeler/controller.go index d992f83..de3e779 100644 --- a/service/labeler/controller.go +++ b/service/labeler/controller.go @@ -117,7 +117,11 @@ 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.Status, mergo.WithOverride); err != nil { lc.logger.Infof("merge error: %v", err) } @@ -125,9 +129,23 @@ func (lc *LabelController) run() error { lc.logger.Infof("Node unchanged") return nil } + _, err := lc.k8sCli.CoreV1().Nodes().Update(dst) - lc.logger.Infof("Node updated") - return err + 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") + } else { + lc.logger.Infof("Node updated") + } + + return nil }, DeleteFunc: func(s string) error { // log.Infof("Node deleted: %s", s)