You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ch...@apache.org on 2022/09/20 03:43:51 UTC
[dolphinscheduler-operator] 14/44: fix(CRD): check the logicCode
This is an automated email from the ASF dual-hosted git repository.
chufenggao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler-operator.git
commit 5f4cc8701aef805d5e83317307981ba5f96cbe14
Author: nobolity <no...@gmail.com>
AuthorDate: Tue May 31 23:06:54 2022 +0800
fix(CRD): check the logicCode
---
api/v1alpha1/ds_public.go | 33 +-
api/v1alpha1/dsalert_types.go | 11 +-
api/v1alpha1/dsapi_types.go | 17 +-
api/v1alpha1/dsworker_types.go | 7 -
api/v1alpha1/zz_generated.deepcopy.go | 80 +-
.../ds.apache.dolphinscheduler.dev_dsalerts.yaml | 411 +------
.../ds.apache.dolphinscheduler.dev_dsapis.yaml | 1173 +++++++++++++++++++-
.../ds.apache.dolphinscheduler.dev_dsmasters.yaml | 200 +---
.../ds.apache.dolphinscheduler.dev_dsworkers.yaml | 200 +---
config/samples/ds_v1alpha1_dsapi.yaml | 3 +-
controllers/alert_reconcile.go | 3 +-
controllers/api_reconcile.go | 6 +-
controllers/deployment.go | 29 +
controllers/dsalert_controller.go | 52 +-
controllers/dsapi_controller.go | 51 +-
controllers/dsmaster_controller.go | 32 +-
controllers/master_reconcile.go | 1 +
controllers/member.go | 8 -
18 files changed, 1420 insertions(+), 897 deletions(-)
diff --git a/api/v1alpha1/ds_public.go b/api/v1alpha1/ds_public.go
index d468fca..efdb8b5 100644
--- a/api/v1alpha1/ds_public.go
+++ b/api/v1alpha1/ds_public.go
@@ -67,8 +67,6 @@ type DsCondition struct {
// PodPolicy defines the policy to create pod for the dm-master container.
type PodPolicy struct {
// Labels specifies the labels to attach to pods the operator creates for the
- // dm-master cluster.
- // "app" and "dm-master_*" labels are reserved for the internal use of the dm-master operator.
// Do not overwrite them.
Labels map[string]string `json:"labels,omitempty"`
@@ -77,34 +75,23 @@ type PodPolicy struct {
// labels.
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
- // The scheduling constraints on dm-master pods.
Affinity *corev1.Affinity `json:"affinity,omitempty"`
- // **DEPRECATED**. Use Affinity instead.
- AntiAffinity bool `json:"antiAffinity,omitempty"`
- // Resources is the resource requirements for the dm-master container.
+ // Resources is the resource requirements for the container.
// This field cannot be updated once the cluster is created.
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
// Tolerations specifies the pod's tolerations.
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
- // List of environment variables to set in the dm-master container.
- // This is used to configure dm-master process. dm-master cluster cannot be created, when
+ // List of environment variables to set in the container.
+ // This is used to configure process. cluster cannot be created, when
// bad environement variables are provided. Do not overwrite any flags used to
// bootstrap the cluster (for example `--initial-cluster` flag).
// This field cannot be updated.
- Envs []corev1.EnvVar `json:"dm-masterEnv,omitempty"`
+ Envs []corev1.EnvVar `json:"envs,omitempty"`
- // PersistentVolumeClaimSpec is the spec to describe PVC for the dm-master container
- // This field is optional. If no PVC spec, dm-master container will use emptyDir as volume
- // Note. This feature is in alpha stage. It is currently only used as non-stable storage,
- // not the stable storage. Future work need to make it used as stable storage.
- PersistentVolumeClaimSpec *corev1.PersistentVolumeClaimSpec `json:"persistentVolumeClaimSpec,omitempty"`
-
- // Annotations specifies the annotations to attach to pods the operator creates for the
- // dm-master cluster.
- // The "dm-master.version" annotation is reserved for the internal use of the dm-master operator.
+ // Annotations specifies the annotations to attach to pods the operator creates for the cluster.
Annotations map[string]string `json:"annotations,omitempty"`
// SecurityContext specifies the security context for the entire pod
@@ -112,6 +99,16 @@ type PodPolicy struct {
SecurityContext *corev1.PodSecurityContext `json:"securityContext,omitempty"`
}
+type DeploymentPolicy struct {
+ Labels map[string]string `json:"labels,omitempty"`
+ Annotations map[string]string `json:"annotations,omitempty"`
+ Envs []corev1.EnvVar `json:"envs,omitempty"`
+ Resources corev1.ResourceRequirements `json:"resources,omitempty"`
+ Affinity *corev1.Affinity `json:"affinity,omitempty"`
+ // Tolerations specifies the pod's tolerations.
+ Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+}
+
type MembersStatus struct {
// Ready are the dsMaster members that are ready to serve requests
// The member names are the same as the dsMaster pod names
diff --git a/api/v1alpha1/dsalert_types.go b/api/v1alpha1/dsalert_types.go
index 65e5c7a..1ad45c2 100644
--- a/api/v1alpha1/dsalert_types.go
+++ b/api/v1alpha1/dsalert_types.go
@@ -49,11 +49,11 @@ type DSAlertSpec struct {
// +kubebuilder:default=3
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=7
- Replicas int `json:"replicas"`
+ Replicas int32 `json:"replicas"`
// Pod defines the policy to create pod for the dm-master pod.
// Updating Pod does not take effect on any existing dm-master pods.
- Pod *PodPolicy `json:"pod,omitempty"`
+ Deployment *DeploymentPolicy `json:"deployment,omitempty"`
// Paused is to pause the control of the operator for the ds-master .
// +kubebuilder:default=false
@@ -61,10 +61,6 @@ type DSAlertSpec struct {
//LogPvcName defines the log capacity of application ,the position is /opt/dolphinscheduler/logs eg 20Gi
LogPvcName string `json:"log_pvc_name,omitempty"`
-
- //ReGenerate defines if delete the old_deployment and create a new deployment
- // +kubebuilder:default=false
- ReGenerate bool `json:"re_generate,omitempty"`
}
// DSAlertStatus defines the observed state of DSAlert
@@ -86,9 +82,6 @@ type DSAlertStatus struct {
// Replicas is the current size of the cluster
// +kubebuilder:default=0
Replicas int `json:"replicas,omitempty"`
-
- // Members are the dsMaster members in the cluster
- Members MembersStatus `json:"members,omitempty"`
}
//+kubebuilder:object:root=true
diff --git a/api/v1alpha1/dsapi_types.go b/api/v1alpha1/dsapi_types.go
index 01f11f9..91db86f 100644
--- a/api/v1alpha1/dsapi_types.go
+++ b/api/v1alpha1/dsapi_types.go
@@ -36,6 +36,8 @@ type DSApiSpec struct {
// +kubebuilder:default="3.0.0-alpha"
Version string `json:"version,omitempty"`
+ ZookeeperConnect string `json:"zookeeper_connect,omitempty"`
+
// Repository is the name of the repository that hosts
// ds container images. It should be direct clone of the repository in official
// By default, it is `apache/dolphinscheduler-master`.
@@ -49,11 +51,11 @@ type DSApiSpec struct {
// +kubebuilder:default=3
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=7
- Replicas int `json:"replicas"`
+ Replicas int32 `json:"replicas"`
// Pod defines the policy to create pod for the dm-master pod.
- // Updating Pod does not take effect on any existing dm-master pods.
- Pod *PodPolicy `json:"pod,omitempty"`
+ // Pod defines the policy to create pod for the dm-master pod.
+ Deployment *DeploymentPolicy `json:"deployment,omitempty"`
// Paused is to pause the control of the operator for the ds-master .
// +kubebuilder:default=false
@@ -62,11 +64,8 @@ type DSApiSpec struct {
//LogPvcName defines the log capacity of application ,the position is /opt/dolphinscheduler/logs eg 20Gi
LogPvcName string `json:"log_pvc_name,omitempty"`
- //ReGenerate defines if delete the old_deployment and create a new deployment
- // +kubebuilder:default=false
- ReGenerate bool `json:"re_generate,omitempty"`
-
//NodePort is the port node exposed
+ // +kubebuilder:default=30001
NodePort int32 `json:"node_port"`
}
@@ -79,6 +78,7 @@ type DSApiStatus struct {
// Phase is the cluster running phase
// +kubebuilder:validation:Enum="";Creating;Running;Failed;Finished
Phase DsPhase `json:"phase,omitempty"`
+
// ControlPaused indicates the operator pauses the control of the cluster.
// +kubebuilder:default=false
ControlPaused bool `json:"controlPaused,omitempty"`
@@ -89,9 +89,6 @@ type DSApiStatus struct {
// Replicas is the current size of the cluster
// +kubebuilder:default=0
Replicas int `json:"replicas,omitempty"`
-
- // Members are the dsMaster members in the cluster
- Members MembersStatus `json:"members,omitempty"`
}
//+kubebuilder:object:root=true
diff --git a/api/v1alpha1/dsworker_types.go b/api/v1alpha1/dsworker_types.go
index df90268..19f90b3 100644
--- a/api/v1alpha1/dsworker_types.go
+++ b/api/v1alpha1/dsworker_types.go
@@ -120,13 +120,6 @@ func init() {
SchemeBuilder.Register(&DSWorker{}, &DSWorkerList{})
}
-func (c *DSWorker) IsPodPVEnabled() bool {
- if podPolicy := c.Spec.Pod; podPolicy != nil {
- return podPolicy.PersistentVolumeClaimSpec != nil
- }
- return false
-}
-
type AlertConfig struct {
ServiceUrl string `json:"service_url,omitempty"`
Port string `json:"port,omitempty"`
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index f69ee99..f828d4d 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -108,9 +108,9 @@ func (in *DSAlertSpec) DeepCopyInto(out *DSAlertSpec) {
*out = new(DateSourceTemplate)
**out = **in
}
- if in.Pod != nil {
- in, out := &in.Pod, &out.Pod
- *out = new(PodPolicy)
+ if in.Deployment != nil {
+ in, out := &in.Deployment, &out.Deployment
+ *out = new(DeploymentPolicy)
(*in).DeepCopyInto(*out)
}
}
@@ -133,7 +133,6 @@ func (in *DSAlertStatus) DeepCopyInto(out *DSAlertStatus) {
*out = make([]DsCondition, len(*in))
copy(*out, *in)
}
- in.Members.DeepCopyInto(&out.Members)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSAlertStatus.
@@ -151,8 +150,8 @@ func (in *DSApi) DeepCopyInto(out *DSApi) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
- out.Spec = in.Spec
- out.Status = in.Status
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSApi.
@@ -208,6 +207,16 @@ func (in *DSApiList) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DSApiSpec) DeepCopyInto(out *DSApiSpec) {
*out = *in
+ if in.Datasource != nil {
+ in, out := &in.Datasource, &out.Datasource
+ *out = new(DateSourceTemplate)
+ **out = **in
+ }
+ if in.Deployment != nil {
+ in, out := &in.Deployment, &out.Deployment
+ *out = new(DeploymentPolicy)
+ (*in).DeepCopyInto(*out)
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSApiSpec.
@@ -223,6 +232,11 @@ func (in *DSApiSpec) DeepCopy() *DSApiSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DSApiStatus) DeepCopyInto(out *DSApiStatus) {
*out = *in
+ if in.Conditions != nil {
+ in, out := &in.Conditions, &out.Conditions
+ *out = make([]DsCondition, len(*in))
+ copy(*out, *in)
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSApiStatus.
@@ -465,6 +479,55 @@ func (in *DateSourceTemplate) DeepCopy() *DateSourceTemplate {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DeploymentPolicy) DeepCopyInto(out *DeploymentPolicy) {
+ *out = *in
+ if in.Labels != nil {
+ in, out := &in.Labels, &out.Labels
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.Annotations != nil {
+ in, out := &in.Annotations, &out.Annotations
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.Envs != nil {
+ in, out := &in.Envs, &out.Envs
+ *out = make([]v1.EnvVar, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ in.Resources.DeepCopyInto(&out.Resources)
+ if in.Affinity != nil {
+ in, out := &in.Affinity, &out.Affinity
+ *out = new(v1.Affinity)
+ (*in).DeepCopyInto(*out)
+ }
+ if in.Tolerations != nil {
+ in, out := &in.Tolerations, &out.Tolerations
+ *out = make([]v1.Toleration, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentPolicy.
+func (in *DeploymentPolicy) DeepCopy() *DeploymentPolicy {
+ if in == nil {
+ return nil
+ }
+ out := new(DeploymentPolicy)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DsCondition) DeepCopyInto(out *DsCondition) {
*out = *in
@@ -542,11 +605,6 @@ func (in *PodPolicy) DeepCopyInto(out *PodPolicy) {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
- if in.PersistentVolumeClaimSpec != nil {
- in, out := &in.PersistentVolumeClaimSpec, &out.PersistentVolumeClaimSpec
- *out = new(v1.PersistentVolumeClaimSpec)
- (*in).DeepCopyInto(*out)
- }
if in.Annotations != nil {
in, out := &in.Annotations, &out.Annotations
*out = make(map[string]string, len(*in))
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml
index b49a713..52c09c4 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml
@@ -51,22 +51,13 @@ spec:
- url
- username
type: object
- log_pvc_name:
- description: LogPvcName defines the log capacity of application ,the
- position is /opt/dolphinscheduler/logs eg 20Gi
- type: string
- paused:
- default: false
- description: Paused is to pause the control of the operator for the
- ds-master .
- type: boolean
- pod:
+ deployment:
description: Pod defines the policy to create pod for the dm-master
pod. Updating Pod does not take effect on any existing dm-master
pods.
properties:
affinity:
- description: The scheduling constraints on dm-master pods.
+ description: Affinity is a group of affinity scheduling rules.
properties:
nodeAffinity:
description: Describes node affinity scheduling rules for
@@ -933,21 +924,8 @@ spec:
annotations:
additionalProperties:
type: string
- description: Annotations specifies the annotations to attach to
- pods the operator creates for the dm-master cluster. The "dm-master.version"
- annotation is reserved for the internal use of the dm-master
- operator.
type: object
- antiAffinity:
- description: '**DEPRECATED**. Use Affinity instead.'
- type: boolean
- dm-masterEnv:
- description: List of environment variables to set in the dm-master
- container. This is used to configure dm-master process. dm-master
- cluster cannot be created, when bad environement variables are
- provided. Do not overwrite any flags used to bootstrap the cluster
- (for example `--initial-cluster` flag). This field cannot be
- updated.
+ envs:
items:
description: EnvVar represents an environment variable present
in a Container.
@@ -1059,191 +1037,10 @@ spec:
labels:
additionalProperties:
type: string
- description: Labels specifies the labels to attach to pods the
- operator creates for the dm-master cluster. "app" and "dm-master_*"
- labels are reserved for the internal use of the dm-master operator.
- Do not overwrite them.
- type: object
- nodeSelector:
- additionalProperties:
- type: string
- description: NodeSelector specifies a map of key-value pairs.
- For the pod to be eligible to run on a node, the node must have
- each of the indicated key-value pairs as labels.
- type: object
- persistentVolumeClaimSpec:
- description: PersistentVolumeClaimSpec is the spec to describe
- PVC for the dm-master container This field is optional. If no
- PVC spec, dm-master container will use emptyDir as volume Note.
- This feature is in alpha stage. It is currently only used as
- non-stable storage, not the stable storage. Future work need
- to make it used as stable storage.
- properties:
- accessModes:
- description: 'AccessModes contains the desired access modes
- the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
- items:
- type: string
- type: array
- dataSource:
- description: 'This field can be used to specify either: *
- An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
- * An existing PVC (PersistentVolumeClaim) If the provisioner
- or an external controller can support the specified data
- source, it will create a new volume based on the contents
- of the specified data source. If the AnyVolumeDataSource
- feature gate is enabled, this field will always have the
- same contents as the DataSourceRef field.'
- properties:
- apiGroup:
- description: APIGroup is the group for the resource being
- referenced. If APIGroup is not specified, the specified
- Kind must be in the core API group. For any other third-party
- types, APIGroup is required.
- type: string
- kind:
- description: Kind is the type of resource being referenced
- type: string
- name:
- description: Name is the name of resource being referenced
- type: string
- required:
- - kind
- - name
- type: object
- dataSourceRef:
- description: 'Specifies the object from which to populate
- the volume with data, if a non-empty volume is desired.
- This may be any local object from a non-empty API group
- (non core object) or a PersistentVolumeClaim object. When
- this field is specified, volume binding will only succeed
- if the type of the specified object matches some installed
- volume populator or dynamic provisioner. This field will
- replace the functionality of the DataSource field and as
- such if both fields are non-empty, they must have the same
- value. For backwards compatibility, both fields (DataSource
- and DataSourceRef) will be set to the same value automatically
- if one of them is empty and the other is non-empty. There
- are two important differences between DataSource and DataSourceRef:
- * While DataSource only allows two specific types of objects,
- DataSourceRef allows any non-core object, as well as PersistentVolumeClaim
- objects. * While DataSource ignores disallowed values (dropping
- them), DataSourceRef preserves all values, and generates
- an error if a disallowed value is specified. (Alpha) Using
- this field requires the AnyVolumeDataSource feature gate
- to be enabled.'
- properties:
- apiGroup:
- description: APIGroup is the group for the resource being
- referenced. If APIGroup is not specified, the specified
- Kind must be in the core API group. For any other third-party
- types, APIGroup is required.
- type: string
- kind:
- description: Kind is the type of resource being referenced
- type: string
- name:
- description: Name is the name of resource being referenced
- type: string
- required:
- - kind
- - name
- type: object
- resources:
- description: 'Resources represents the minimum resources the
- volume should have. If RecoverVolumeExpansionFailure feature
- is enabled users are allowed to specify resource requirements
- that are lower than previous value but must still be higher
- than capacity recorded in the status field of the claim.
- More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
- properties:
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount of compute
- resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount of
- compute resources required. If Requests is omitted for
- a container, it defaults to Limits if that is explicitly
- specified, otherwise to an implementation-defined value.
- More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- type: object
- selector:
- description: A label query over volumes to consider for binding.
- properties:
- matchExpressions:
- description: matchExpressions is a list of label selector
- requirements. The requirements are ANDed.
- items:
- description: A label selector requirement is a selector
- that contains values, a key, and an operator that
- relates the key and values.
- properties:
- key:
- description: key is the label key that the selector
- applies to.
- type: string
- operator:
- description: operator represents a key's relationship
- to a set of values. Valid operators are In, NotIn,
- Exists and DoesNotExist.
- type: string
- values:
- description: values is an array of string values.
- If the operator is In or NotIn, the values array
- must be non-empty. If the operator is Exists or
- DoesNotExist, the values array must be empty.
- This array is replaced during a strategic merge
- patch.
- items:
- type: string
- type: array
- required:
- - key
- - operator
- type: object
- type: array
- matchLabels:
- additionalProperties:
- type: string
- description: matchLabels is a map of {key,value} pairs.
- A single {key,value} in the matchLabels map is equivalent
- to an element of matchExpressions, whose key field is
- "key", the operator is "In", and the values array contains
- only "value". The requirements are ANDed.
- type: object
- type: object
- storageClassName:
- description: 'Name of the StorageClass required by the claim.
- More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
- type: string
- volumeMode:
- description: volumeMode defines what type of volume is required
- by the claim. Value of Filesystem is implied when not included
- in claim spec.
- type: string
- volumeName:
- description: VolumeName is the binding reference to the PersistentVolume
- backing this claim.
- type: string
type: object
resources:
- description: Resources is the resource requirements for the dm-master
- container. This field cannot be updated once the cluster is
- created.
+ description: ResourceRequirements describes the compute resource
+ requirements.
properties:
limits:
additionalProperties:
@@ -1268,177 +1065,6 @@ spec:
to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
type: object
- securityContext:
- description: 'SecurityContext specifies the security context for
- the entire pod More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context'
- properties:
- fsGroup:
- description: "A special supplemental group that applies to
- all containers in a pod. Some volume types allow the Kubelet
- to change the ownership of that volume to be owned by the
- pod: \n 1. The owning GID will be the FSGroup 2. The setgid
- bit is set (new files created in the volume will be owned
- by FSGroup) 3. The permission bits are OR'd with rw-rw----
- \n If unset, the Kubelet will not modify the ownership and
- permissions of any volume. Note that this field cannot be
- set when spec.os.name is windows."
- format: int64
- type: integer
- fsGroupChangePolicy:
- description: 'fsGroupChangePolicy defines behavior of changing
- ownership and permission of the volume before being exposed
- inside Pod. This field will only apply to volume types which
- support fsGroup based ownership(and permissions). It will
- have no effect on ephemeral volume types such as: secret,
- configmaps and emptydir. Valid values are "OnRootMismatch"
- and "Always". If not specified, "Always" is used. Note that
- this field cannot be set when spec.os.name is windows.'
- type: string
- runAsGroup:
- description: The GID to run the entrypoint of the container
- process. Uses runtime default if unset. May also be set
- in SecurityContext. If set in both SecurityContext and
- PodSecurityContext, the value specified in SecurityContext
- takes precedence for that container. Note that this field
- cannot be set when spec.os.name is windows.
- format: int64
- type: integer
- runAsNonRoot:
- description: Indicates that the container must run as a non-root
- user. If true, the Kubelet will validate the image at runtime
- to ensure that it does not run as UID 0 (root) and fail
- to start the container if it does. If unset or false, no
- such validation will be performed. May also be set in SecurityContext. If
- set in both SecurityContext and PodSecurityContext, the
- value specified in SecurityContext takes precedence.
- type: boolean
- runAsUser:
- description: The UID to run the entrypoint of the container
- process. Defaults to user specified in image metadata if
- unspecified. May also be set in SecurityContext. If set
- in both SecurityContext and PodSecurityContext, the value
- specified in SecurityContext takes precedence for that container.
- Note that this field cannot be set when spec.os.name is
- windows.
- format: int64
- type: integer
- seLinuxOptions:
- description: The SELinux context to be applied to all containers.
- If unspecified, the container runtime will allocate a random
- SELinux context for each container. May also be set in
- SecurityContext. If set in both SecurityContext and PodSecurityContext,
- the value specified in SecurityContext takes precedence
- for that container. Note that this field cannot be set when
- spec.os.name is windows.
- properties:
- level:
- description: Level is SELinux level label that applies
- to the container.
- type: string
- role:
- description: Role is a SELinux role label that applies
- to the container.
- type: string
- type:
- description: Type is a SELinux type label that applies
- to the container.
- type: string
- user:
- description: User is a SELinux user label that applies
- to the container.
- type: string
- type: object
- seccompProfile:
- description: The seccomp options to use by the containers
- in this pod. Note that this field cannot be set when spec.os.name
- is windows.
- properties:
- localhostProfile:
- description: localhostProfile indicates a profile defined
- in a file on the node should be used. The profile must
- be preconfigured on the node to work. Must be a descending
- path, relative to the kubelet's configured seccomp profile
- location. Must only be set if type is "Localhost".
- type: string
- type:
- description: "type indicates which kind of seccomp profile
- will be applied. Valid options are: \n Localhost - a
- profile defined in a file on the node should be used.
- RuntimeDefault - the container runtime default profile
- should be used. Unconfined - no profile should be applied."
- type: string
- required:
- - type
- type: object
- supplementalGroups:
- description: A list of groups applied to the first process
- run in each container, in addition to the container's primary
- GID. If unspecified, no groups will be added to any container.
- Note that this field cannot be set when spec.os.name is
- windows.
- items:
- format: int64
- type: integer
- type: array
- sysctls:
- description: Sysctls hold a list of namespaced sysctls used
- for the pod. Pods with unsupported sysctls (by the container
- runtime) might fail to launch. Note that this field cannot
- be set when spec.os.name is windows.
- items:
- description: Sysctl defines a kernel parameter to be set
- properties:
- name:
- description: Name of a property to set
- type: string
- value:
- description: Value of a property to set
- type: string
- required:
- - name
- - value
- type: object
- type: array
- windowsOptions:
- description: The Windows specific settings applied to all
- containers. If unspecified, the options within a container's
- SecurityContext will be used. If set in both SecurityContext
- and PodSecurityContext, the value specified in SecurityContext
- takes precedence. Note that this field cannot be set when
- spec.os.name is linux.
- properties:
- gmsaCredentialSpec:
- description: GMSACredentialSpec is where the GMSA admission
- webhook (https://github.com/kubernetes-sigs/windows-gmsa)
- inlines the contents of the GMSA credential spec named
- by the GMSACredentialSpecName field.
- type: string
- gmsaCredentialSpecName:
- description: GMSACredentialSpecName is the name of the
- GMSA credential spec to use.
- type: string
- hostProcess:
- description: HostProcess determines if a container should
- be run as a 'Host Process' container. This field is
- alpha-level and will only be honored by components that
- enable the WindowsHostProcessContainers feature flag.
- Setting this field without the feature flag will result
- in errors when validating the Pod. All of a Pod's containers
- must have the same effective HostProcess value (it is
- not allowed to have a mix of HostProcess containers
- and non-HostProcess containers). In addition, if HostProcess
- is true then HostNetwork must also be set to true.
- type: boolean
- runAsUserName:
- description: The UserName in Windows to run the entrypoint
- of the container process. Defaults to the user specified
- in image metadata if unspecified. May also be set in
- PodSecurityContext. If set in both SecurityContext and
- PodSecurityContext, the value specified in SecurityContext
- takes precedence.
- type: string
- type: object
- type: object
tolerations:
description: Tolerations specifies the pod's tolerations.
items:
@@ -1481,16 +1107,21 @@ spec:
type: object
type: array
type: object
- re_generate:
+ log_pvc_name:
+ description: LogPvcName defines the log capacity of application ,the
+ position is /opt/dolphinscheduler/logs eg 20Gi
+ type: string
+ paused:
default: false
- description: ReGenerate defines if delete the old_deployment and create
- a new deployment
+ description: Paused is to pause the control of the operator for the
+ ds-master .
type: boolean
replicas:
default: 3
description: Replicas is the expected size of the ms-master. The ds-master-operator
will eventually make the size of the running equal to the expected
size. The vaild range of the size is from 1 to 7.
+ format: int32
maximum: 7
minimum: 1
type: integer
@@ -1554,22 +1185,6 @@ spec:
description: ControlPaused indicates the operator pauses the control
of the cluster.
type: boolean
- members:
- description: Members are the dsMaster members in the cluster
- properties:
- ready:
- description: Ready are the dsMaster members that are ready to
- serve requests The member names are the same as the dsMaster
- pod names
- items:
- type: string
- type: array
- unready:
- description: Unready are the etcd members not ready to serve requests
- items:
- type: string
- type: array
- type: object
phase:
description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
of cluster Important: Run "make" to regenerate code after modifying
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml
index 5f98244..2753d6e 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml
@@ -35,13 +35,1180 @@ spec:
spec:
description: DSApiSpec defines the desired state of DSApi
properties:
- foo:
- description: Foo is an example field of DSApi. Edit dsapi_types.go
- to remove/update
+ datasource:
+ properties:
+ drive_name:
+ type: string
+ password:
+ type: string
+ url:
+ type: string
+ username:
+ type: string
+ required:
+ - drive_name
+ - password
+ - url
+ - username
+ type: object
+ deployment:
+ description: Pod defines the policy to create pod for the dm-master
+ pod. Pod defines the policy to create pod for the dm-master pod.
+ properties:
+ affinity:
+ description: Affinity is a group of affinity scheduling rules.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for
+ the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the affinity expressions specified
+ by this field, but it may choose a node that violates
+ one or more of the expressions. The node that is most
+ preferred is the one with the greatest sum of weights,
+ i.e. for each node that meets all of the scheduling
+ requirements (resource request, requiredDuringScheduling
+ affinity expressions, etc.), compute a sum by iterating
+ through the elements of this field and adding "weight"
+ to the sum if the node matches the corresponding matchExpressions;
+ the node(s) with the highest sum are the most preferred.
+ items:
+ description: An empty preferred scheduling term matches
+ all objects with implicit weight 0 (i.e. it's a no-op).
+ A null preferred scheduling term matches no objects
+ (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated with
+ the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ weight:
+ description: Weight associated with matching the
+ corresponding nodeSelectorTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by
+ this field are not met at scheduling time, the pod will
+ not be scheduled onto the node. If the affinity requirements
+ specified by this field cease to be met at some point
+ during pod execution (e.g. due to an update), the system
+ may or may not try to eventually evict the pod from
+ its node.
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms.
+ The terms are ORed.
+ items:
+ description: A null or empty node selector term
+ matches no objects. The requirements of them are
+ ANDed. The TopologySelectorTerm type implements
+ a subset of the NodeSelectorTerm.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g.
+ co-locate this pod in the same node, zone, etc. as some
+ other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the affinity expressions specified
+ by this field, but it may choose a node that violates
+ one or more of the expressions. The node that is most
+ preferred is the one with the greatest sum of weights,
+ i.e. for each node that meets all of the scheduling
+ requirements (resource request, requiredDuringScheduling
+ affinity expressions, etc.), compute a sum by iterating
+ through the elements of this field and adding "weight"
+ to the sum if the node has pods which matches the corresponding
+ podAffinityTerm; the node(s) with the highest sum are
+ the most preferred.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator
+ is "In", and the values array contains
+ only "value". The requirements are ANDed.
+ type: object
+ type: object
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces. This
+ field is beta-level and is only honored when
+ PodAffinityNamespaceSelector feature is enabled.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator
+ is "In", and the values array contains
+ only "value". The requirements are ANDed.
+ type: object
+ type: object
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace"
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: This pod should be co-located (affinity)
+ or not co-located (anti-affinity) with the
+ pods matching the labelSelector in the specified
+ namespaces, where co-located is defined as
+ running on a node whose value of the label
+ with key topologyKey matches that of any node
+ on which any of the selected pods is running.
+ Empty topologyKey is not allowed.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by
+ this field are not met at scheduling time, the pod will
+ not be scheduled onto the node. If the affinity requirements
+ specified by this field cease to be met at some point
+ during pod execution (e.g. due to a pod label update),
+ the system may or may not try to eventually evict the
+ pod from its node. When there are multiple elements,
+ the lists of nodes corresponding to each podAffinityTerm
+ are intersected, i.e. all terms must be satisfied.
+ items:
+ description: Defines a set of pods (namely those matching
+ the labelSelector relative to the given namespace(s))
+ that this pod should be co-located (affinity) or not
+ co-located (anti-affinity) with, where co-located
+ is defined as running on a node whose value of the
+ label with key <topologyKey> matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator is
+ "In", and the values array contains only "value".
+ The requirements are ANDed.
+ type: object
+ type: object
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces. This field is beta-level
+ and is only honored when PodAffinityNamespaceSelector
+ feature is enabled.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator is
+ "In", and the values array contains only "value".
+ The requirements are ANDed.
+ type: object
+ type: object
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace"
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: This pod should be co-located (affinity)
+ or not co-located (anti-affinity) with the pods
+ matching the labelSelector in the specified namespaces,
+ where co-located is defined as running on a node
+ whose value of the label with key topologyKey
+ matches that of any node on which any of the selected
+ pods is running. Empty topologyKey is not allowed.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules
+ (e.g. avoid putting this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the anti-affinity expressions
+ specified by this field, but it may choose a node that
+ violates one or more of the expressions. The node that
+ is most preferred is the one with the greatest sum of
+ weights, i.e. for each node that meets all of the scheduling
+ requirements (resource request, requiredDuringScheduling
+ anti-affinity expressions, etc.), compute a sum by iterating
+ through the elements of this field and adding "weight"
+ to the sum if the node has pods which matches the corresponding
+ podAffinityTerm; the node(s) with the highest sum are
+ the most preferred.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator
+ is "In", and the values array contains
+ only "value". The requirements are ANDed.
+ type: object
+ type: object
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces. This
+ field is beta-level and is only honored when
+ PodAffinityNamespaceSelector feature is enabled.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator
+ is "In", and the values array contains
+ only "value". The requirements are ANDed.
+ type: object
+ type: object
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace"
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: This pod should be co-located (affinity)
+ or not co-located (anti-affinity) with the
+ pods matching the labelSelector in the specified
+ namespaces, where co-located is defined as
+ running on a node whose value of the label
+ with key topologyKey matches that of any node
+ on which any of the selected pods is running.
+ Empty topologyKey is not allowed.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time, the pod
+ will not be scheduled onto the node. If the anti-affinity
+ requirements specified by this field cease to be met
+ at some point during pod execution (e.g. due to a pod
+ label update), the system may or may not try to eventually
+ evict the pod from its node. When there are multiple
+ elements, the lists of nodes corresponding to each podAffinityTerm
+ are intersected, i.e. all terms must be satisfied.
+ items:
+ description: Defines a set of pods (namely those matching
+ the labelSelector relative to the given namespace(s))
+ that this pod should be co-located (affinity) or not
+ co-located (anti-affinity) with, where co-located
+ is defined as running on a node whose value of the
+ label with key <topologyKey> matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator is
+ "In", and the values array contains only "value".
+ The requirements are ANDed.
+ type: object
+ type: object
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces. This field is beta-level
+ and is only honored when PodAffinityNamespaceSelector
+ feature is enabled.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: matchLabels is a map of {key,value}
+ pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions,
+ whose key field is "key", the operator is
+ "In", and the values array contains only "value".
+ The requirements are ANDed.
+ type: object
+ type: object
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace"
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: This pod should be co-located (affinity)
+ or not co-located (anti-affinity) with the pods
+ matching the labelSelector in the specified namespaces,
+ where co-located is defined as running on a node
+ whose value of the label with key topologyKey
+ matches that of any node on which any of the selected
+ pods is running. Empty topologyKey is not allowed.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ annotations:
+ additionalProperties:
+ type: string
+ type: object
+ envs:
+ items:
+ description: EnvVar represents an environment variable present
+ in a Container.
+ properties:
+ name:
+ description: Name of the environment variable. Must be a
+ C_IDENTIFIER.
+ type: string
+ value:
+ description: 'Variable references $(VAR_NAME) are expanded
+ using the previously defined environment variables in
+ the container and any service environment variables. If
+ a variable cannot be resolved, the reference in the input
+ string will be unchanged. Double $$ are reduced to a single
+ $, which allows for escaping the $(VAR_NAME) syntax: i.e.
+ "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)".
+ Escaped references will never be expanded, regardless
+ of whether the variable exists or not. Defaults to "".'
+ type: string
+ valueFrom:
+ description: Source for the environment variable's value.
+ Cannot be used if value is not empty.
+ properties:
+ configMapKeyRef:
+ description: Selects a key of a ConfigMap.
+ properties:
+ key:
+ description: The key to select.
+ type: string
+ name:
+ description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+ TODO: Add other useful fields. apiVersion, kind,
+ uid?'
+ type: string
+ optional:
+ description: Specify whether the ConfigMap or its
+ key must be defined
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ description: 'Selects a field of the pod: supports metadata.name,
+ metadata.namespace, `metadata.labels[''<KEY>'']`,
+ `metadata.annotations[''<KEY>'']`, spec.nodeName,
+ spec.serviceAccountName, status.hostIP, status.podIP,
+ status.podIPs.'
+ properties:
+ apiVersion:
+ description: Version of the schema the FieldPath
+ is written in terms of, defaults to "v1".
+ type: string
+ fieldPath:
+ description: Path of the field to select in the
+ specified API version.
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ description: 'Selects a resource of the container: only
+ resources limits and requests (limits.cpu, limits.memory,
+ limits.ephemeral-storage, requests.cpu, requests.memory
+ and requests.ephemeral-storage) are currently supported.'
+ properties:
+ containerName:
+ description: 'Container name: required for volumes,
+ optional for env vars'
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ description: Specifies the output format of the
+ exposed resources, defaults to "1"
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ description: 'Required: resource to select'
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ description: Selects a key of a secret in the pod's
+ namespace
+ properties:
+ key:
+ description: The key of the secret to select from. Must
+ be a valid secret key.
+ type: string
+ name:
+ description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+ TODO: Add other useful fields. apiVersion, kind,
+ uid?'
+ type: string
+ optional:
+ description: Specify whether the Secret or its key
+ must be defined
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ labels:
+ additionalProperties:
+ type: string
+ type: object
+ resources:
+ description: ResourceRequirements describes the compute resource
+ requirements.
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Limits describes the maximum amount of compute
+ resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Requests describes the minimum amount of compute
+ resources required. If Requests is omitted for a container,
+ it defaults to Limits if that is explicitly specified, otherwise
+ to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ type: object
+ tolerations:
+ description: Tolerations specifies the pod's tolerations.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple <key,value,effect> using
+ the matching operator <operator>.
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified, allowed
+ values are NoSchedule, PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration applies
+ to. Empty means match all taint keys. If the key is empty,
+ operator must be Exists; this combination means to match
+ all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship to
+ the value. Valid operators are Exists and Equal. Defaults
+ to Equal. Exists is equivalent to wildcard for value,
+ so that a pod can tolerate all taints of a particular
+ category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the taint
+ forever (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ type: object
+ log_pvc_name:
+ description: LogPvcName defines the log capacity of application ,the
+ position is /opt/dolphinscheduler/logs eg 20Gi
type: string
+ node_port:
+ default: 30001
+ description: NodePort is the port node exposed
+ format: int32
+ type: integer
+ paused:
+ default: false
+ description: Paused is to pause the control of the operator for the
+ ds-master .
+ type: boolean
+ replicas:
+ default: 3
+ description: Replicas is the expected size of the ms-master. The ds-master-operator
+ will eventually make the size of the running equal to the expected
+ size. The vaild range of the size is from 1 to 7.
+ format: int32
+ maximum: 7
+ minimum: 1
+ type: integer
+ repository:
+ default: apache/dolphinscheduler-master
+ description: Repository is the name of the repository that hosts ds
+ container images. It should be direct clone of the repository in
+ official By default, it is `apache/dolphinscheduler-master`.
+ type: string
+ version:
+ default: 3.0.0-alpha
+ description: Version is the expected version of the ds cluster. The
+ ds-operator will eventually make the ds cluster version equal to
+ the expected version. If version is not set, default is "3.0.0-alpha".
+ type: string
+ zookeeper_connect:
+ type: string
+ required:
+ - datasource
+ - node_port
+ - replicas
type: object
status:
description: DSApiStatus defines the observed state of DSApi
+ properties:
+ conditions:
+ description: Condition keeps track of all cluster conditions, if they
+ exist.
+ items:
+ description: DsCondition represents one current condition of a ds
+ cluster. A condition might not show up if it is not happening.
+ For example, if a cluster is not upgrading, the Upgrading condition
+ would not show up. If a cluster is upgrading and encountered a
+ problem that prevents the upgrade, the Upgrading condition's status
+ will would be False and communicate the problem back.
+ properties:
+ lastTransitionTime:
+ description: Last time the condition transitioned from one status
+ to another.
+ type: string
+ lastUpdateTime:
+ description: The last time this condition was updated.
+ type: string
+ message:
+ description: A human readable message indicating details about
+ the transition.
+ type: string
+ reason:
+ description: The reason for the condition's last transition.
+ type: string
+ status:
+ description: Status of the condition, one of True, False, Unknown.
+ type: string
+ type:
+ description: Type of cluster condition.
+ type: string
+ required:
+ - status
+ - type
+ type: object
+ type: array
+ controlPaused:
+ default: false
+ description: ControlPaused indicates the operator pauses the control
+ of the cluster.
+ type: boolean
+ phase:
+ description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
+ of cluster Important: Run "make" to regenerate code after modifying
+ this file INSERT ADDITIONAL STATUS FIELD - define observed state
+ of cluster Important: Run "make" to regenerate code after modifying
+ this file Phase is the cluster running phase'
+ enum:
+ - ""
+ - Creating
+ - Running
+ - Failed
+ - Finished
+ type: string
+ replicas:
+ default: 0
+ description: Replicas is the current size of the cluster
+ type: integer
type: object
type: object
served: true
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml
index 0aff315..1823d52 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml
@@ -66,7 +66,7 @@ spec:
pods.
properties:
affinity:
- description: The scheduling constraints on dm-master pods.
+ description: Affinity is a group of affinity scheduling rules.
properties:
nodeAffinity:
description: Describes node affinity scheduling rules for
@@ -934,20 +934,14 @@ spec:
additionalProperties:
type: string
description: Annotations specifies the annotations to attach to
- pods the operator creates for the dm-master cluster. The "dm-master.version"
- annotation is reserved for the internal use of the dm-master
- operator.
+ pods the operator creates for the cluster.
type: object
- antiAffinity:
- description: '**DEPRECATED**. Use Affinity instead.'
- type: boolean
- dm-masterEnv:
- description: List of environment variables to set in the dm-master
- container. This is used to configure dm-master process. dm-master
- cluster cannot be created, when bad environement variables are
- provided. Do not overwrite any flags used to bootstrap the cluster
- (for example `--initial-cluster` flag). This field cannot be
- updated.
+ envs:
+ description: List of environment variables to set in the container.
+ This is used to configure process. cluster cannot be created,
+ when bad environement variables are provided. Do not overwrite
+ any flags used to bootstrap the cluster (for example `--initial-cluster`
+ flag). This field cannot be updated.
items:
description: EnvVar represents an environment variable present
in a Container.
@@ -1060,9 +1054,7 @@ spec:
additionalProperties:
type: string
description: Labels specifies the labels to attach to pods the
- operator creates for the dm-master cluster. "app" and "dm-master_*"
- labels are reserved for the internal use of the dm-master operator.
- Do not overwrite them.
+ operator creates for the Do not overwrite them.
type: object
nodeSelector:
additionalProperties:
@@ -1071,179 +1063,9 @@ spec:
For the pod to be eligible to run on a node, the node must have
each of the indicated key-value pairs as labels.
type: object
- persistentVolumeClaimSpec:
- description: PersistentVolumeClaimSpec is the spec to describe
- PVC for the dm-master container This field is optional. If no
- PVC spec, dm-master container will use emptyDir as volume Note.
- This feature is in alpha stage. It is currently only used as
- non-stable storage, not the stable storage. Future work need
- to make it used as stable storage.
- properties:
- accessModes:
- description: 'AccessModes contains the desired access modes
- the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
- items:
- type: string
- type: array
- dataSource:
- description: 'This field can be used to specify either: *
- An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
- * An existing PVC (PersistentVolumeClaim) If the provisioner
- or an external controller can support the specified data
- source, it will create a new volume based on the contents
- of the specified data source. If the AnyVolumeDataSource
- feature gate is enabled, this field will always have the
- same contents as the DataSourceRef field.'
- properties:
- apiGroup:
- description: APIGroup is the group for the resource being
- referenced. If APIGroup is not specified, the specified
- Kind must be in the core API group. For any other third-party
- types, APIGroup is required.
- type: string
- kind:
- description: Kind is the type of resource being referenced
- type: string
- name:
- description: Name is the name of resource being referenced
- type: string
- required:
- - kind
- - name
- type: object
- dataSourceRef:
- description: 'Specifies the object from which to populate
- the volume with data, if a non-empty volume is desired.
- This may be any local object from a non-empty API group
- (non core object) or a PersistentVolumeClaim object. When
- this field is specified, volume binding will only succeed
- if the type of the specified object matches some installed
- volume populator or dynamic provisioner. This field will
- replace the functionality of the DataSource field and as
- such if both fields are non-empty, they must have the same
- value. For backwards compatibility, both fields (DataSource
- and DataSourceRef) will be set to the same value automatically
- if one of them is empty and the other is non-empty. There
- are two important differences between DataSource and DataSourceRef:
- * While DataSource only allows two specific types of objects,
- DataSourceRef allows any non-core object, as well as PersistentVolumeClaim
- objects. * While DataSource ignores disallowed values (dropping
- them), DataSourceRef preserves all values, and generates
- an error if a disallowed value is specified. (Alpha) Using
- this field requires the AnyVolumeDataSource feature gate
- to be enabled.'
- properties:
- apiGroup:
- description: APIGroup is the group for the resource being
- referenced. If APIGroup is not specified, the specified
- Kind must be in the core API group. For any other third-party
- types, APIGroup is required.
- type: string
- kind:
- description: Kind is the type of resource being referenced
- type: string
- name:
- description: Name is the name of resource being referenced
- type: string
- required:
- - kind
- - name
- type: object
- resources:
- description: 'Resources represents the minimum resources the
- volume should have. If RecoverVolumeExpansionFailure feature
- is enabled users are allowed to specify resource requirements
- that are lower than previous value but must still be higher
- than capacity recorded in the status field of the claim.
- More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
- properties:
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount of compute
- resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount of
- compute resources required. If Requests is omitted for
- a container, it defaults to Limits if that is explicitly
- specified, otherwise to an implementation-defined value.
- More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- type: object
- selector:
- description: A label query over volumes to consider for binding.
- properties:
- matchExpressions:
- description: matchExpressions is a list of label selector
- requirements. The requirements are ANDed.
- items:
- description: A label selector requirement is a selector
- that contains values, a key, and an operator that
- relates the key and values.
- properties:
- key:
- description: key is the label key that the selector
- applies to.
- type: string
- operator:
- description: operator represents a key's relationship
- to a set of values. Valid operators are In, NotIn,
- Exists and DoesNotExist.
- type: string
- values:
- description: values is an array of string values.
- If the operator is In or NotIn, the values array
- must be non-empty. If the operator is Exists or
- DoesNotExist, the values array must be empty.
- This array is replaced during a strategic merge
- patch.
- items:
- type: string
- type: array
- required:
- - key
- - operator
- type: object
- type: array
- matchLabels:
- additionalProperties:
- type: string
- description: matchLabels is a map of {key,value} pairs.
- A single {key,value} in the matchLabels map is equivalent
- to an element of matchExpressions, whose key field is
- "key", the operator is "In", and the values array contains
- only "value". The requirements are ANDed.
- type: object
- type: object
- storageClassName:
- description: 'Name of the StorageClass required by the claim.
- More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
- type: string
- volumeMode:
- description: volumeMode defines what type of volume is required
- by the claim. Value of Filesystem is implied when not included
- in claim spec.
- type: string
- volumeName:
- description: VolumeName is the binding reference to the PersistentVolume
- backing this claim.
- type: string
- type: object
resources:
- description: Resources is the resource requirements for the dm-master
- container. This field cannot be updated once the cluster is
- created.
+ description: Resources is the resource requirements for the container.
+ This field cannot be updated once the cluster is created.
properties:
limits:
additionalProperties:
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml
index a7dfb80..b3d53cb 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml
@@ -79,7 +79,7 @@ spec:
pods.
properties:
affinity:
- description: The scheduling constraints on dm-master pods.
+ description: Affinity is a group of affinity scheduling rules.
properties:
nodeAffinity:
description: Describes node affinity scheduling rules for
@@ -947,20 +947,14 @@ spec:
additionalProperties:
type: string
description: Annotations specifies the annotations to attach to
- pods the operator creates for the dm-master cluster. The "dm-master.version"
- annotation is reserved for the internal use of the dm-master
- operator.
+ pods the operator creates for the cluster.
type: object
- antiAffinity:
- description: '**DEPRECATED**. Use Affinity instead.'
- type: boolean
- dm-masterEnv:
- description: List of environment variables to set in the dm-master
- container. This is used to configure dm-master process. dm-master
- cluster cannot be created, when bad environement variables are
- provided. Do not overwrite any flags used to bootstrap the cluster
- (for example `--initial-cluster` flag). This field cannot be
- updated.
+ envs:
+ description: List of environment variables to set in the container.
+ This is used to configure process. cluster cannot be created,
+ when bad environement variables are provided. Do not overwrite
+ any flags used to bootstrap the cluster (for example `--initial-cluster`
+ flag). This field cannot be updated.
items:
description: EnvVar represents an environment variable present
in a Container.
@@ -1073,9 +1067,7 @@ spec:
additionalProperties:
type: string
description: Labels specifies the labels to attach to pods the
- operator creates for the dm-master cluster. "app" and "dm-master_*"
- labels are reserved for the internal use of the dm-master operator.
- Do not overwrite them.
+ operator creates for the Do not overwrite them.
type: object
nodeSelector:
additionalProperties:
@@ -1084,179 +1076,9 @@ spec:
For the pod to be eligible to run on a node, the node must have
each of the indicated key-value pairs as labels.
type: object
- persistentVolumeClaimSpec:
- description: PersistentVolumeClaimSpec is the spec to describe
- PVC for the dm-master container This field is optional. If no
- PVC spec, dm-master container will use emptyDir as volume Note.
- This feature is in alpha stage. It is currently only used as
- non-stable storage, not the stable storage. Future work need
- to make it used as stable storage.
- properties:
- accessModes:
- description: 'AccessModes contains the desired access modes
- the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
- items:
- type: string
- type: array
- dataSource:
- description: 'This field can be used to specify either: *
- An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
- * An existing PVC (PersistentVolumeClaim) If the provisioner
- or an external controller can support the specified data
- source, it will create a new volume based on the contents
- of the specified data source. If the AnyVolumeDataSource
- feature gate is enabled, this field will always have the
- same contents as the DataSourceRef field.'
- properties:
- apiGroup:
- description: APIGroup is the group for the resource being
- referenced. If APIGroup is not specified, the specified
- Kind must be in the core API group. For any other third-party
- types, APIGroup is required.
- type: string
- kind:
- description: Kind is the type of resource being referenced
- type: string
- name:
- description: Name is the name of resource being referenced
- type: string
- required:
- - kind
- - name
- type: object
- dataSourceRef:
- description: 'Specifies the object from which to populate
- the volume with data, if a non-empty volume is desired.
- This may be any local object from a non-empty API group
- (non core object) or a PersistentVolumeClaim object. When
- this field is specified, volume binding will only succeed
- if the type of the specified object matches some installed
- volume populator or dynamic provisioner. This field will
- replace the functionality of the DataSource field and as
- such if both fields are non-empty, they must have the same
- value. For backwards compatibility, both fields (DataSource
- and DataSourceRef) will be set to the same value automatically
- if one of them is empty and the other is non-empty. There
- are two important differences between DataSource and DataSourceRef:
- * While DataSource only allows two specific types of objects,
- DataSourceRef allows any non-core object, as well as PersistentVolumeClaim
- objects. * While DataSource ignores disallowed values (dropping
- them), DataSourceRef preserves all values, and generates
- an error if a disallowed value is specified. (Alpha) Using
- this field requires the AnyVolumeDataSource feature gate
- to be enabled.'
- properties:
- apiGroup:
- description: APIGroup is the group for the resource being
- referenced. If APIGroup is not specified, the specified
- Kind must be in the core API group. For any other third-party
- types, APIGroup is required.
- type: string
- kind:
- description: Kind is the type of resource being referenced
- type: string
- name:
- description: Name is the name of resource being referenced
- type: string
- required:
- - kind
- - name
- type: object
- resources:
- description: 'Resources represents the minimum resources the
- volume should have. If RecoverVolumeExpansionFailure feature
- is enabled users are allowed to specify resource requirements
- that are lower than previous value but must still be higher
- than capacity recorded in the status field of the claim.
- More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
- properties:
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount of compute
- resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount of
- compute resources required. If Requests is omitted for
- a container, it defaults to Limits if that is explicitly
- specified, otherwise to an implementation-defined value.
- More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- type: object
- selector:
- description: A label query over volumes to consider for binding.
- properties:
- matchExpressions:
- description: matchExpressions is a list of label selector
- requirements. The requirements are ANDed.
- items:
- description: A label selector requirement is a selector
- that contains values, a key, and an operator that
- relates the key and values.
- properties:
- key:
- description: key is the label key that the selector
- applies to.
- type: string
- operator:
- description: operator represents a key's relationship
- to a set of values. Valid operators are In, NotIn,
- Exists and DoesNotExist.
- type: string
- values:
- description: values is an array of string values.
- If the operator is In or NotIn, the values array
- must be non-empty. If the operator is Exists or
- DoesNotExist, the values array must be empty.
- This array is replaced during a strategic merge
- patch.
- items:
- type: string
- type: array
- required:
- - key
- - operator
- type: object
- type: array
- matchLabels:
- additionalProperties:
- type: string
- description: matchLabels is a map of {key,value} pairs.
- A single {key,value} in the matchLabels map is equivalent
- to an element of matchExpressions, whose key field is
- "key", the operator is "In", and the values array contains
- only "value". The requirements are ANDed.
- type: object
- type: object
- storageClassName:
- description: 'Name of the StorageClass required by the claim.
- More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
- type: string
- volumeMode:
- description: volumeMode defines what type of volume is required
- by the claim. Value of Filesystem is implied when not included
- in claim spec.
- type: string
- volumeName:
- description: VolumeName is the binding reference to the PersistentVolume
- backing this claim.
- type: string
- type: object
resources:
- description: Resources is the resource requirements for the dm-master
- container. This field cannot be updated once the cluster is
- created.
+ description: Resources is the resource requirements for the container.
+ This field cannot be updated once the cluster is created.
properties:
limits:
additionalProperties:
diff --git a/config/samples/ds_v1alpha1_dsapi.yaml b/config/samples/ds_v1alpha1_dsapi.yaml
index e3264d7..fef6f69 100644
--- a/config/samples/ds_v1alpha1_dsapi.yaml
+++ b/config/samples/ds_v1alpha1_dsapi.yaml
@@ -8,8 +8,9 @@ metadata:
spec:
replicas: 1
version: 3.0.0-alpha
+ zookeeper_connect: "172.17.0.5:2181"
repository: apache/dolphinscheduler-api
- node_port:30002
+ node_port: 30002
datasource:
drive_name: "org.postgresql.Driver"
url: "jdbc:postgresql://172.17.0.4:5432/dolphinscheduler"
diff --git a/controllers/alert_reconcile.go b/controllers/alert_reconcile.go
index 0f6d0b1..ae94938 100644
--- a/controllers/alert_reconcile.go
+++ b/controllers/alert_reconcile.go
@@ -54,7 +54,7 @@ func createAlertDeployment(cluster *dsv1alpha1.DSAlert) *v1.Deployment {
Namespace: cluster.Namespace,
},
Spec: v1.DeploymentSpec{
- Replicas: int32Ptr(int32(cluster.Spec.Replicas)),
+ Replicas: int32Ptr(cluster.Spec.Replicas),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
dsv1alpha1.DsAppName: dsv1alpha1.DsAlert,
@@ -71,6 +71,7 @@ func createAlertDeployment(cluster *dsv1alpha1.DSAlert) *v1.Deployment {
Name: dsv1alpha1.DsAlert,
Image: ImageName(cluster.Spec.Repository, cluster.Spec.Version),
ImagePullPolicy: corev1.PullIfNotPresent,
+
Env: []corev1.EnvVar{
{
Name: dsv1alpha1.DataSourceDriveName,
diff --git a/controllers/api_reconcile.go b/controllers/api_reconcile.go
index 0062c14..f8bc647 100644
--- a/controllers/api_reconcile.go
+++ b/controllers/api_reconcile.go
@@ -56,7 +56,7 @@ func createApiDeployment(cluster *dsv1alpha1.DSApi) *v1.Deployment {
Namespace: cluster.Namespace,
},
Spec: v1.DeploymentSpec{
- Replicas: int32Ptr(int32(cluster.Spec.Replicas)),
+ Replicas: int32Ptr(cluster.Spec.Replicas),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
dsv1alpha1.DsAppName: dsv1alpha1.DsApi,
@@ -74,6 +74,10 @@ func createApiDeployment(cluster *dsv1alpha1.DSApi) *v1.Deployment {
Image: ImageName(cluster.Spec.Repository, cluster.Spec.Version),
ImagePullPolicy: corev1.PullIfNotPresent,
Env: []corev1.EnvVar{
+ {
+ Name: dsv1alpha1.EnvZookeeper,
+ Value: cluster.Spec.ZookeeperConnect,
+ },
{
Name: dsv1alpha1.DataSourceDriveName,
Value: cluster.Spec.Datasource.DriveName,
diff --git a/controllers/deployment.go b/controllers/deployment.go
index 3c0bc70..c965210 100644
--- a/controllers/deployment.go
+++ b/controllers/deployment.go
@@ -1,6 +1,7 @@
package controllers
import (
+ dsv1alpha1 "dolphinscheduler-operator/api/v1alpha1"
v1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
@@ -10,6 +11,34 @@ func IsDeploymentAvailable(deployment *v1.Deployment) bool {
return IsDeploymentAvailableConditionTrue(deployment.Status)
}
+func applyDeploymentPolicy(deployment *v1.Deployment, policy *dsv1alpha1.DeploymentPolicy) {
+ if policy == nil {
+ return
+ }
+
+ if policy.Affinity != nil {
+ deployment.Spec.Template.Spec.Affinity = policy.Affinity
+ }
+
+ if len(policy.Tolerations) != 0 {
+ deployment.Spec.Template.Spec.Tolerations = policy.Tolerations
+ }
+
+ mergeLabels(deployment.Labels, policy.Labels)
+
+ if &policy.Resources != nil {
+ deployment.Spec.Template.Spec.Containers[0] = containerWithRequirements(deployment.Spec.Template.Spec.Containers[0], policy.Resources)
+ }
+
+ if len(policy.Envs) != 0 {
+ deployment.Spec.Template.Spec.Containers[0].Env = append(deployment.Spec.Template.Spec.Containers[0].Env, policy.Envs...)
+ }
+
+ for key, value := range policy.Annotations {
+ deployment.ObjectMeta.Annotations[key] = value
+ }
+}
+
// IsDeploymentAvailableConditionTrue returns true if a deployment is available; false otherwise.
func IsDeploymentAvailableConditionTrue(status v1.DeploymentStatus) bool {
condition := GetDeploymentAvailableCondition(status)
diff --git a/controllers/dsalert_controller.go b/controllers/dsalert_controller.go
index 787585b..2b6d88f 100644
--- a/controllers/dsalert_controller.go
+++ b/controllers/dsalert_controller.go
@@ -125,14 +125,15 @@ func (r *DSAlertReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
alertLogger.Info("Ensuring alert service")
if err := r.ensureAlertService(ctx, cluster); err != nil {
- return ctrl.Result{Requeue: true}, nil
+ return ctrl.Result{Requeue: false}, nil
}
+ alertLogger.Info("Ensuring alert Deployment")
if requeue, err := r.ensureAlertDeployment(ctx, cluster); err != nil {
return ctrl.Result{Requeue: false}, err
} else {
- if !requeue {
- return ctrl.Result{Requeue: false}, nil
+ if requeue {
+ return ctrl.Result{RequeueAfter: 3 * time.Second}, nil
}
}
@@ -150,7 +151,6 @@ func (r *DSAlertReconciler) SetupWithManager(mgr ctrl.Manager) error {
For(&dsv1alpha1.DSAlert{}).
Owns(&v1.Deployment{}).
Owns(&corev1.Service{}).
- Owns(&corev1.Pod{}).
Complete(r)
}
@@ -171,15 +171,15 @@ func (r *DSAlertReconciler) ensureAlertService(ctx context.Context, cluster *dsv
if apierrors.IsNotFound(err) {
service = createAlertService(cluster)
if err := controllerutil.SetControllerReference(cluster, service, r.Scheme); err != nil {
- logger.Info("create alert service error")
+ alertLogger.Info("create alert service error")
return err
}
// Remote may already exist, so we will return err, for the next time, this code will not execute
if err := r.Client.Create(ctx, service); err != nil {
- logger.Info("create alert service error1")
+ alertLogger.Info("create alert service error1")
return err
}
- logger.Info("the alert service had been created")
+ alertLogger.Info("the alert service had been created")
}
}
return nil
@@ -191,31 +191,51 @@ func (r *DSAlertReconciler) ensureAlertDeployment(ctx context.Context, cluster *
if err := r.Client.Get(ctx, deploymentNamespaceName, deployment); err != nil {
if apierrors.IsNotFound(err) {
deployment = createAlertDeployment(cluster)
+ applyDeploymentPolicy(deployment, cluster.Spec.Deployment)
}
if err := controllerutil.SetControllerReference(cluster, deployment, r.Scheme); err != nil {
- return true, err
+ return false, err
}
if err := r.Client.Create(ctx, deployment); err == nil {
+ alertLogger.Info("the alert deployment had been created")
return false, nil
} else {
- return true, err
+ return false, err
}
} else {
- err := r.updateAlertDeployment(ctx, deployment, cluster)
- if err != nil {
- return false, err
+ if r.predicateUpdate(deployment, cluster) {
+ alertLogger.Info("alert need to update")
+ err := r.updateAlertDeployment(ctx, deployment, cluster)
+ if err != nil {
+ return false, err
+ }
+ return true, nil
+ } else {
+ alertLogger.Info("begin to check alert deployment ")
+ if IsDeploymentAvailable(deployment) {
+ alertLogger.Info("deployment is available ")
+ return false, nil
+ } else {
+ return true, nil
+ }
}
}
-
- return true, nil
}
-//only notice the property of replicas and image and version
func (r *DSAlertReconciler) updateAlertDeployment(ctx context.Context, deployment *v1.Deployment, cluster *dsv1alpha1.DSAlert) error {
- deployment.Spec.Replicas = int32Ptr(int32(cluster.Spec.Replicas))
+ deployment.Spec.Replicas = int32Ptr(cluster.Spec.Replicas)
deployment.Spec.Template.Spec.Containers[0].Image = ImageName(cluster.Spec.Repository, cluster.Spec.Version)
if err := r.Client.Update(ctx, deployment); err != nil {
return err
}
return nil
}
+
+//only notice the property of replicas and image and version
+func (r *DSAlertReconciler) predicateUpdate(deployment *v1.Deployment, cluster *dsv1alpha1.DSAlert) bool {
+ if *deployment.Spec.Replicas == (cluster.Spec.Replicas) && deployment.Spec.Template.Spec.Containers[0].Image == ImageName(cluster.Spec.Repository, cluster.Spec.Version) {
+ alertLogger.Info("no need update")
+ return false
+ }
+ return true
+}
diff --git a/controllers/dsapi_controller.go b/controllers/dsapi_controller.go
index 8d74913..4e95511 100644
--- a/controllers/dsapi_controller.go
+++ b/controllers/dsapi_controller.go
@@ -125,14 +125,14 @@ func (r *DSApiReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
apiLogger.Info("Ensuring Api service")
if err := r.ensureApiService(ctx, cluster); err != nil {
- return ctrl.Result{Requeue: true}, nil
+ return ctrl.Result{Requeue: false}, nil
}
if requeue, err := r.ensureApiDeployment(ctx, cluster); err != nil {
return ctrl.Result{Requeue: false}, err
} else {
- if !requeue {
- return ctrl.Result{Requeue: false}, nil
+ if requeue {
+ return ctrl.Result{RequeueAfter: 3 * time.Second}, nil
}
}
@@ -150,7 +150,6 @@ func (r *DSApiReconciler) SetupWithManager(mgr ctrl.Manager) error {
For(&dsv1alpha1.DSApi{}).
Owns(&v1.Deployment{}).
Owns(&corev1.Service{}).
- Owns(&corev1.Pod{}).
Complete(r)
}
@@ -167,19 +166,19 @@ func (r *DSApiReconciler) ensureApiService(ctx context.Context, cluster *dsv1alp
namespacedName := types.NamespacedName{Namespace: cluster.Namespace, Name: dsv1alpha1.DsApiServiceValue}
if err := r.Client.Get(ctx, namespacedName, service); err != nil {
// Local cache not found
- logger.Info("get service error")
+ apiLogger.Info("api get service error")
if apierrors.IsNotFound(err) {
service = createApiService(cluster)
if err := controllerutil.SetControllerReference(cluster, service, r.Scheme); err != nil {
- logger.Info("create Api service error")
+ apiLogger.Info("create Api service error")
return err
}
// Remote may already exist, so we will return err, for the next time, this code will not execute
if err := r.Client.Create(ctx, service); err != nil {
- logger.Info("create Api service error1")
+ apiLogger.Info("create Api service error1")
return err
}
- logger.Info("the Api service had been created")
+ apiLogger.Info("the Api service had been created")
}
}
return nil
@@ -191,31 +190,51 @@ func (r *DSApiReconciler) ensureApiDeployment(ctx context.Context, cluster *dsv1
if err := r.Client.Get(ctx, deploymentNamespaceName, deployment); err != nil {
if apierrors.IsNotFound(err) {
deployment = createApiDeployment(cluster)
+ applyDeploymentPolicy(deployment, cluster.Spec.Deployment)
}
if err := controllerutil.SetControllerReference(cluster, deployment, r.Scheme); err != nil {
- return true, err
+ return false, err
}
if err := r.Client.Create(ctx, deployment); err == nil {
+ apiLogger.Info("the api deployment had been created")
return false, nil
} else {
- return true, err
+ return false, err
}
} else {
- err := r.updateApiDeployment(ctx, deployment, cluster)
- if err != nil {
- return false, err
+ if r.predicateUpdate(deployment, cluster) {
+ apiLogger.Info("api need to update")
+ err := r.updateApiDeployment(ctx, deployment, cluster)
+ if err != nil {
+ return false, err
+ }
+ return true, nil
+ } else {
+ apiLogger.Info("begin to check deployment ")
+ if IsDeploymentAvailable(deployment) {
+ apiLogger.Info("api deployment is available ")
+ return false, nil
+ } else {
+ return true, nil
+ }
}
}
-
- return true, nil
}
//only notice the property of replicas and image and version
func (r *DSApiReconciler) updateApiDeployment(ctx context.Context, deployment *v1.Deployment, cluster *dsv1alpha1.DSApi) error {
- deployment.Spec.Replicas = int32Ptr(int32(cluster.Spec.Replicas))
+ deployment.Spec.Replicas = int32Ptr(cluster.Spec.Replicas)
deployment.Spec.Template.Spec.Containers[0].Image = ImageName(cluster.Spec.Repository, cluster.Spec.Version)
if err := r.Client.Update(ctx, deployment); err != nil {
return err
}
return nil
}
+
+func (r *DSApiReconciler) predicateUpdate(deployment *v1.Deployment, cluster *dsv1alpha1.DSApi) bool {
+ if *deployment.Spec.Replicas == (cluster.Spec.Replicas) && deployment.Spec.Template.Spec.Containers[0].Image == ImageName(cluster.Spec.Repository, cluster.Spec.Version) {
+ apiLogger.Info("no need update")
+ return false
+ }
+ return true
+}
diff --git a/controllers/dsmaster_controller.go b/controllers/dsmaster_controller.go
index f863d45..df05da5 100644
--- a/controllers/dsmaster_controller.go
+++ b/controllers/dsmaster_controller.go
@@ -99,7 +99,6 @@ func (r *DSMasterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
}
} else {
// The object is being deleted
-
if controllerutil.ContainsFinalizer(desired, dsv1alpha1.FinalizerName) {
// our finalizer is present, so lets handle any external dependency
if err := r.ensureDSMasterDeleted(ctx, cluster); err != nil {
@@ -117,7 +116,7 @@ func (r *DSMasterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
}
// If dsmaster-cluster is paused, we do nothing on things changed.
- // Until dsmaster-cluster is un-paused, we will reconcile to the the state of that point.
+ // Until dsmaster-cluster is un-paused, we will reconcile to the state of that point.
if cluster.Spec.Paused {
logger.Info("ds-master control has been paused: ", "ds-master-name", cluster.Name)
desired.Status.ControlPaused = true
@@ -257,17 +256,14 @@ func (r *DSMasterReconciler) createMember(ctx context.Context, cluster *dsv1alph
}
func (r *DSMasterReconciler) deletePod(ctx context.Context, pod *corev1.Pod) error {
-
logger.Info("begin delete pod", "pod name", pod.Name)
if err := r.Client.Delete(ctx, pod); err != nil && !apierrors.IsNotFound(err) {
return err
}
-
return nil
}
func (r *DSMasterReconciler) ensureUpgraded(ctx context.Context, cluster *dsv1alpha1.DSMaster) (bool, error) {
-
ms, err := r.podMemberSet(ctx, cluster)
if err != nil {
return false, err
@@ -275,7 +271,7 @@ func (r *DSMasterReconciler) ensureUpgraded(ctx context.Context, cluster *dsv1al
logger.Info("cluster.Spec.Version", "cluster.Spec.Version", cluster.Spec.Version)
for _, memset := range ms {
- if memset.Version != cluster.Spec.Version {
+ if r.predicateUpdate(memset, cluster) {
pod := &corev1.Pod{}
pod.SetName(memset.Name)
pod.SetNamespace(memset.Namespace)
@@ -312,19 +308,15 @@ func (r *DSMasterReconciler) ensureMasterService(ctx context.Context, cluster *d
namespacedName := types.NamespacedName{Namespace: cluster.Namespace, Name: dsv1alpha1.DsServiceLabelValue}
if err := r.Client.Get(ctx, namespacedName, service); err != nil {
// Local cache not found
- logger.Info("get service error")
if apierrors.IsNotFound(err) {
service = createMasterService(cluster)
if err := controllerutil.SetControllerReference(cluster, service, r.Scheme); err != nil {
- logger.Info("create service error")
return err
}
// Remote may already exist, so we will return err, for the next time, this code will not execute
if err := r.Client.Create(ctx, service); err != nil {
- logger.Info("create service error1")
return err
}
- logger.Info("the headless service had been created")
}
}
return nil
@@ -348,15 +340,7 @@ func (r *Predicate) Update(evt event.UpdateEvent) bool {
oldC := evt.ObjectOld.(*dsv1alpha1.DSMaster)
newC := evt.ObjectNew.(*dsv1alpha1.DSMaster)
- logger.V(5).Info("Running update filter",
- "Old size", oldC.Spec.Replicas,
- "New size", newC.Spec.Replicas,
- "old paused", oldC.Spec.Paused,
- "new paused", newC.Spec.Paused,
- "old object deletion", !oldC.ObjectMeta.DeletionTimestamp.IsZero(),
- "new object deletion", !newC.ObjectMeta.DeletionTimestamp.IsZero())
-
- // Only care about size, version and paused fields
+ // Only care about size, repo,version and paused fields
if oldC.Spec.Replicas != newC.Spec.Replicas {
return true
}
@@ -369,7 +353,11 @@ func (r *Predicate) Update(evt event.UpdateEvent) bool {
return true
}
- // If cluster has been marked as deleted, check if we have remove our finalizer
+ if oldC.Spec.Repository != newC.Spec.Repository {
+ return true
+ }
+
+ // If cluster has been marked as deleted, check if we have removed our finalizer
// If it has our finalizer, indicating our cleaning up works has not been done.
if oldC.DeletionTimestamp.IsZero() && !newC.DeletionTimestamp.IsZero() {
if controllerutil.ContainsFinalizer(newC, dsv1alpha1.FinalizerName) {
@@ -399,3 +387,7 @@ func (r *Predicate) Generic(evt event.GenericEvent) bool {
}
return false
}
+
+func (r *DSMasterReconciler) predicateUpdate(member *Member, cluster *dsv1alpha1.DSMaster) bool {
+ return member.Version != cluster.Spec.Version
+}
diff --git a/controllers/master_reconcile.go b/controllers/master_reconcile.go
index b42c58f..2c6e722 100644
--- a/controllers/master_reconcile.go
+++ b/controllers/master_reconcile.go
@@ -111,6 +111,7 @@ func newDSMasterPod(cr *dsv1alpha1.DSMaster) *corev1.Pod {
Hostname: podName,
Subdomain: dsv1alpha1.DsServiceLabelValue,
SetHostnameAsFQDN: &isSetHostnameAsFQDN,
+
Containers: []corev1.Container{
{
Name: cr.Name,
diff --git a/controllers/member.go b/controllers/member.go
index f36b51c..1b75a79 100644
--- a/controllers/member.go
+++ b/controllers/member.go
@@ -44,14 +44,6 @@ func (m Member) Ordinal() int {
type MemberSet map[string]*Member
-func NewMemberSet(ms ...*Member) MemberSet {
- res := MemberSet{}
- for _, m := range ms {
- res[m.Name] = m
- }
- return res
-}
-
// the set of all members of s1 that are not members of s2
func (ms MemberSet) Diff(other MemberSet) MemberSet {
diff := MemberSet{}