diff --git a/apis/management.cattle.io/v3/cluster_types.go b/apis/management.cattle.io/v3/cluster_types.go index 6ca0c0ae7f..f2cd40b515 100644 --- a/apis/management.cattle.io/v3/cluster_types.go +++ b/apis/management.cattle.io/v3/cluster_types.go @@ -147,6 +147,14 @@ type ClusterStatus struct { MonitoringStatus *MonitoringStatus `json:"monitoringStatus,omitempty" norman:"nocreate,noupdate"` IstioEnabled bool `json:"istioEnabled,omitempty" norman:"nocreate,noupdate,default=false"` CertificatesExpiration map[string]CertExpiration `json:"certificatesExpiration,omitempty"` + NodeUpgradeStatus *NodeUpgradeStatus `json:"nodeUpgradeStatus,omitempty" norman:"nocreate,noupdate"` +} + +type NodeUpgradeStatus struct { + LastAppliedToken string `json:"lastAppliedToken"` + CurrentToken string `json:"currentToken"` + // map[currentToken]map[nodeName]state + Nodes map[string]map[string]string `json:"nodes"` } type ClusterComponentStatus struct { diff --git a/apis/management.cattle.io/v3/rke_types.go b/apis/management.cattle.io/v3/rke_types.go index 084d63e50f..24d1e9ffd6 100644 --- a/apis/management.cattle.io/v3/rke_types.go +++ b/apis/management.cattle.io/v3/rke_types.go @@ -4,6 +4,8 @@ import ( "github.com/rancher/norman/types" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/sets" apiserverv1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1" auditv1 "k8s.io/apiserver/pkg/apis/audit/v1" apiserverconfig "k8s.io/apiserver/pkg/apis/config" @@ -58,6 +60,18 @@ type RancherKubernetesEngineConfig struct { RotateCertificates *RotateCertificates `yaml:"rotate_certificates,omitempty" json:"rotateCertificates,omitempty"` // DNS Config DNS *DNSConfig `yaml:"dns" json:"dns,omitempty"` + // Upgrade Strategy + NodeUpgradeStrategy *NodeUpgradeStrategy `yaml:"node_upgrade_strategy,omitempty" json:"nodeUpgradeStrategy,omitempty"` +} + +type NodeUpgradeStrategy struct { + RollingUpdate *RollingUpdateStrategy `yaml:"rolling_update_strategy,omitempty" json:"rollingUpdateStrategy,omitempty"` +} + +type RollingUpdateStrategy struct { + MaxUnavailable intstr.IntOrString `yaml:"max_unavailable,omitempty" json:"maxUnavailable,omitempty"` + Drain bool `yaml:"drain" json:"drain,omitempty"` + DrainInput *NodeDrainInput `yaml:"node_drain_input" json:"nodeDrainInput,omitempty"` } type BastionHost struct { @@ -445,6 +459,54 @@ type RKEConfigNodePlan struct { Taints []RKETaint `json:"taints,omitempty"` } +type RKEClusterPlan struct { + // Map of cluster plan for RKE worker nodes + Processes map[string]RKEProcess +} + +type RKEProcess struct { + // Process name, this should be the container name + Name string `json:"name,omitempty"` + // Process Entrypoint command + Command []string `json:"command,omitempty"` + // Process command map + CommandMap map[string]string `json:"commandMap,omitempty"` + // Process args + Args []string `json:"args,omitempty"` + // Process args map + ArgsMap map[string]sets.Empty `json:"argsMap,omitempty"` + // Environment variables list + Env []string `json:"env,omitempty"` + // Environment variables map + EnvMap map[string]sets.Empty `json:"envMap,omitempty"` + // Process docker image + Image string `json:"image,omitempty"` + //AuthConfig for image private registry + ImageRegistryAuthConfig string `json:"imageRegistryAuthConfig,omitempty"` + // Process docker image VolumesFrom + VolumesFrom []string `json:"volumesFrom,omitempty"` + // Process docker container bind mounts + Binds []string `json:"binds,omitempty"` + // Process docker container bind mounts + BindsMap map[string]sets.Empty `json:"bindsMap,omitempty"` + // Process docker container netwotk mode + NetworkMode string `json:"networkMode,omitempty"` + // Process container restart policy + RestartPolicy string `json:"restartPolicy,omitempty"` + // Process container pid mode + PidMode string `json:"pidMode,omitempty"` + // Run process in privileged container + Privileged bool `json:"privileged,omitempty"` + // Process healthcheck + HealthCheck HealthCheck `json:"healthCheck,omitempty"` + // Process docker container Labels + Labels map[string]string `json:"labels,omitempty"` + // Process docker publish container's port to host + Publish []string `json:"publish,omitempty"` + // docker will run the container with this user + User string `json:"user,omitempty"` +} + type Process struct { // Process name, this should be the container name Name string `json:"name,omitempty"` diff --git a/apis/management.cattle.io/v3/zz_generated_deepcopy.go b/apis/management.cattle.io/v3/zz_generated_deepcopy.go index fe78cafd7b..57f866d5fb 100644 --- a/apis/management.cattle.io/v3/zz_generated_deepcopy.go +++ b/apis/management.cattle.io/v3/zz_generated_deepcopy.go @@ -5,6 +5,7 @@ import ( corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" runtime "k8s.io/apimachinery/pkg/runtime" + sets "k8s.io/apimachinery/pkg/util/sets" version "k8s.io/apimachinery/pkg/version" v1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1" v1 "k8s.io/apiserver/pkg/apis/audit/v1" @@ -2303,6 +2304,11 @@ func (in *ClusterStatus) DeepCopyInto(out *ClusterStatus) { (*out)[key] = val } } + if in.NodeUpgradeStatus != nil { + in, out := &in.NodeUpgradeStatus, &out.NodeUpgradeStatus + *out = new(NodeUpgradeStatus) + (*in).DeepCopyInto(*out) + } return } @@ -6302,6 +6308,60 @@ func (in *NodeTemplateStatus) DeepCopy() *NodeTemplateStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeUpgradeStatus) DeepCopyInto(out *NodeUpgradeStatus) { + *out = *in + if in.Nodes != nil { + in, out := &in.Nodes, &out.Nodes + *out = make(map[string]map[string]string, len(*in)) + for key, val := range *in { + var outVal map[string]string + if val == nil { + (*out)[key] = nil + } else { + in, out := &val, &outVal + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + (*out)[key] = outVal + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeUpgradeStatus. +func (in *NodeUpgradeStatus) DeepCopy() *NodeUpgradeStatus { + if in == nil { + return nil + } + out := new(NodeUpgradeStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeUpgradeStrategy) DeepCopyInto(out *NodeUpgradeStrategy) { + *out = *in + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(RollingUpdateStrategy) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeUpgradeStrategy. +func (in *NodeUpgradeStrategy) DeepCopy() *NodeUpgradeStrategy { + if in == nil { + return nil + } + out := new(NodeUpgradeStrategy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Nodelocal) DeepCopyInto(out *Nodelocal) { *out = *in @@ -8148,6 +8208,29 @@ func (in *RKEAddonList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RKEClusterPlan) DeepCopyInto(out *RKEClusterPlan) { + *out = *in + if in.Processes != nil { + in, out := &in.Processes, &out.Processes + *out = make(map[string]RKEProcess, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RKEClusterPlan. +func (in *RKEClusterPlan) DeepCopy() *RKEClusterPlan { + if in == nil { + return nil + } + out := new(RKEClusterPlan) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RKEConfigNode) DeepCopyInto(out *RKEConfigNode) { *out = *in @@ -8404,6 +8487,88 @@ func (in *RKEPlan) DeepCopy() *RKEPlan { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RKEProcess) DeepCopyInto(out *RKEProcess) { + *out = *in + if in.Command != nil { + in, out := &in.Command, &out.Command + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.CommandMap != nil { + in, out := &in.CommandMap, &out.CommandMap + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Args != nil { + in, out := &in.Args, &out.Args + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ArgsMap != nil { + in, out := &in.ArgsMap, &out.ArgsMap + *out = make(map[string]sets.Empty, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Env != nil { + in, out := &in.Env, &out.Env + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.EnvMap != nil { + in, out := &in.EnvMap, &out.EnvMap + *out = make(map[string]sets.Empty, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.VolumesFrom != nil { + in, out := &in.VolumesFrom, &out.VolumesFrom + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Binds != nil { + in, out := &in.Binds, &out.Binds + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.BindsMap != nil { + in, out := &in.BindsMap, &out.BindsMap + *out = make(map[string]sets.Empty, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + out.HealthCheck = in.HealthCheck + 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.Publish != nil { + in, out := &in.Publish, &out.Publish + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RKEProcess. +func (in *RKEProcess) DeepCopy() *RKEProcess { + if in == nil { + return nil + } + out := new(RKEProcess) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RKESystemImages) DeepCopyInto(out *RKESystemImages) { *out = *in @@ -8480,6 +8645,11 @@ func (in *RancherKubernetesEngineConfig) DeepCopyInto(out *RancherKubernetesEngi *out = new(DNSConfig) (*in).DeepCopyInto(*out) } + if in.NodeUpgradeStrategy != nil { + in, out := &in.NodeUpgradeStrategy, &out.NodeUpgradeStrategy + *out = new(NodeUpgradeStrategy) + (*in).DeepCopyInto(*out) + } return } @@ -8644,6 +8814,28 @@ func (in *RollingUpdate) DeepCopy() *RollingUpdate { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RollingUpdateStrategy) DeepCopyInto(out *RollingUpdateStrategy) { + *out = *in + out.MaxUnavailable = in.MaxUnavailable + if in.DrainInput != nil { + in, out := &in.DrainInput, &out.DrainInput + *out = new(NodeDrainInput) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RollingUpdateStrategy. +func (in *RollingUpdateStrategy) DeepCopy() *RollingUpdateStrategy { + if in == nil { + return nil + } + out := new(RollingUpdateStrategy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RotateCertificateInput) DeepCopyInto(out *RotateCertificateInput) { *out = *in diff --git a/client/management/v3/zz_generated_cluster.go b/client/management/v3/zz_generated_cluster.go index 00f097bc79..824a43c153 100644 --- a/client/management/v3/zz_generated_cluster.go +++ b/client/management/v3/zz_generated_cluster.go @@ -46,6 +46,7 @@ const ( ClusterFieldLocalClusterAuthEndpoint = "localClusterAuthEndpoint" ClusterFieldMonitoringStatus = "monitoringStatus" ClusterFieldName = "name" + ClusterFieldNodeUpgradeStatus = "nodeUpgradeStatus" ClusterFieldOwnerReferences = "ownerReferences" ClusterFieldRancherKubernetesEngineConfig = "rancherKubernetesEngineConfig" ClusterFieldRemoved = "removed" @@ -100,6 +101,7 @@ type Cluster struct { LocalClusterAuthEndpoint *LocalClusterAuthEndpoint `json:"localClusterAuthEndpoint,omitempty" yaml:"localClusterAuthEndpoint,omitempty"` MonitoringStatus *MonitoringStatus `json:"monitoringStatus,omitempty" yaml:"monitoringStatus,omitempty"` Name string `json:"name,omitempty" yaml:"name,omitempty"` + NodeUpgradeStatus *NodeUpgradeStatus `json:"nodeUpgradeStatus,omitempty" yaml:"nodeUpgradeStatus,omitempty"` OwnerReferences []OwnerReference `json:"ownerReferences,omitempty" yaml:"ownerReferences,omitempty"` RancherKubernetesEngineConfig *RancherKubernetesEngineConfig `json:"rancherKubernetesEngineConfig,omitempty" yaml:"rancherKubernetesEngineConfig,omitempty"` Removed string `json:"removed,omitempty" yaml:"removed,omitempty"` diff --git a/client/management/v3/zz_generated_cluster_status.go b/client/management/v3/zz_generated_cluster_status.go index 793d46c5e1..66ebe4f3be 100644 --- a/client/management/v3/zz_generated_cluster_status.go +++ b/client/management/v3/zz_generated_cluster_status.go @@ -20,6 +20,7 @@ const ( ClusterStatusFieldIstioEnabled = "istioEnabled" ClusterStatusFieldLimits = "limits" ClusterStatusFieldMonitoringStatus = "monitoringStatus" + ClusterStatusFieldNodeUpgradeStatus = "nodeUpgradeStatus" ClusterStatusFieldRequested = "requested" ClusterStatusFieldVersion = "version" ) @@ -43,6 +44,7 @@ type ClusterStatus struct { IstioEnabled bool `json:"istioEnabled,omitempty" yaml:"istioEnabled,omitempty"` Limits map[string]string `json:"limits,omitempty" yaml:"limits,omitempty"` MonitoringStatus *MonitoringStatus `json:"monitoringStatus,omitempty" yaml:"monitoringStatus,omitempty"` + NodeUpgradeStatus *NodeUpgradeStatus `json:"nodeUpgradeStatus,omitempty" yaml:"nodeUpgradeStatus,omitempty"` Requested map[string]string `json:"requested,omitempty" yaml:"requested,omitempty"` Version *Info `json:"version,omitempty" yaml:"version,omitempty"` } diff --git a/client/management/v3/zz_generated_node_upgrade_status.go b/client/management/v3/zz_generated_node_upgrade_status.go new file mode 100644 index 0000000000..9cf57b98a0 --- /dev/null +++ b/client/management/v3/zz_generated_node_upgrade_status.go @@ -0,0 +1,14 @@ +package client + +const ( + NodeUpgradeStatusType = "nodeUpgradeStatus" + NodeUpgradeStatusFieldCurrentToken = "currentToken" + NodeUpgradeStatusFieldLastAppliedToken = "lastAppliedToken" + NodeUpgradeStatusFieldNodes = "nodes" +) + +type NodeUpgradeStatus struct { + CurrentToken string `json:"currentToken,omitempty" yaml:"currentToken,omitempty"` + LastAppliedToken string `json:"lastAppliedToken,omitempty" yaml:"lastAppliedToken,omitempty"` + Nodes map[string]map[string]string `json:"nodes,omitempty" yaml:"nodes,omitempty"` +} diff --git a/client/management/v3/zz_generated_node_upgrade_strategy.go b/client/management/v3/zz_generated_node_upgrade_strategy.go new file mode 100644 index 0000000000..727b25e720 --- /dev/null +++ b/client/management/v3/zz_generated_node_upgrade_strategy.go @@ -0,0 +1,10 @@ +package client + +const ( + NodeUpgradeStrategyType = "nodeUpgradeStrategy" + NodeUpgradeStrategyFieldRollingUpdate = "rollingUpdateStrategy" +) + +type NodeUpgradeStrategy struct { + RollingUpdate *RollingUpdateStrategy `json:"rollingUpdateStrategy,omitempty" yaml:"rollingUpdateStrategy,omitempty"` +} diff --git a/client/management/v3/zz_generated_rancher_kubernetes_engine_config.go b/client/management/v3/zz_generated_rancher_kubernetes_engine_config.go index 9774086af1..fbd247a29a 100644 --- a/client/management/v3/zz_generated_rancher_kubernetes_engine_config.go +++ b/client/management/v3/zz_generated_rancher_kubernetes_engine_config.go @@ -15,6 +15,7 @@ const ( RancherKubernetesEngineConfigFieldIngress = "ingress" RancherKubernetesEngineConfigFieldMonitoring = "monitoring" RancherKubernetesEngineConfigFieldNetwork = "network" + RancherKubernetesEngineConfigFieldNodeUpgradeStrategy = "nodeUpgradeStrategy" RancherKubernetesEngineConfigFieldNodes = "nodes" RancherKubernetesEngineConfigFieldPrefixPath = "prefixPath" RancherKubernetesEngineConfigFieldPrivateRegistries = "privateRegistries" @@ -28,27 +29,28 @@ const ( ) type RancherKubernetesEngineConfig struct { - AddonJobTimeout int64 `json:"addonJobTimeout,omitempty" yaml:"addonJobTimeout,omitempty"` - Addons string `json:"addons,omitempty" yaml:"addons,omitempty"` - AddonsInclude []string `json:"addonsInclude,omitempty" yaml:"addonsInclude,omitempty"` - Authentication *AuthnConfig `json:"authentication,omitempty" yaml:"authentication,omitempty"` - Authorization *AuthzConfig `json:"authorization,omitempty" yaml:"authorization,omitempty"` - BastionHost *BastionHost `json:"bastionHost,omitempty" yaml:"bastionHost,omitempty"` - CloudProvider *CloudProvider `json:"cloudProvider,omitempty" yaml:"cloudProvider,omitempty"` - ClusterName string `json:"clusterName,omitempty" yaml:"clusterName,omitempty"` - DNS *DNSConfig `json:"dns,omitempty" yaml:"dns,omitempty"` - IgnoreDockerVersion bool `json:"ignoreDockerVersion,omitempty" yaml:"ignoreDockerVersion,omitempty"` - Ingress *IngressConfig `json:"ingress,omitempty" yaml:"ingress,omitempty"` - Monitoring *MonitoringConfig `json:"monitoring,omitempty" yaml:"monitoring,omitempty"` - Network *NetworkConfig `json:"network,omitempty" yaml:"network,omitempty"` - Nodes []RKEConfigNode `json:"nodes,omitempty" yaml:"nodes,omitempty"` - PrefixPath string `json:"prefixPath,omitempty" yaml:"prefixPath,omitempty"` - PrivateRegistries []PrivateRegistry `json:"privateRegistries,omitempty" yaml:"privateRegistries,omitempty"` - Restore *RestoreConfig `json:"restore,omitempty" yaml:"restore,omitempty"` - RotateCertificates *RotateCertificates `json:"rotateCertificates,omitempty" yaml:"rotateCertificates,omitempty"` - SSHAgentAuth bool `json:"sshAgentAuth,omitempty" yaml:"sshAgentAuth,omitempty"` - SSHCertPath string `json:"sshCertPath,omitempty" yaml:"sshCertPath,omitempty"` - SSHKeyPath string `json:"sshKeyPath,omitempty" yaml:"sshKeyPath,omitempty"` - Services *RKEConfigServices `json:"services,omitempty" yaml:"services,omitempty"` - Version string `json:"kubernetesVersion,omitempty" yaml:"kubernetesVersion,omitempty"` + AddonJobTimeout int64 `json:"addonJobTimeout,omitempty" yaml:"addonJobTimeout,omitempty"` + Addons string `json:"addons,omitempty" yaml:"addons,omitempty"` + AddonsInclude []string `json:"addonsInclude,omitempty" yaml:"addonsInclude,omitempty"` + Authentication *AuthnConfig `json:"authentication,omitempty" yaml:"authentication,omitempty"` + Authorization *AuthzConfig `json:"authorization,omitempty" yaml:"authorization,omitempty"` + BastionHost *BastionHost `json:"bastionHost,omitempty" yaml:"bastionHost,omitempty"` + CloudProvider *CloudProvider `json:"cloudProvider,omitempty" yaml:"cloudProvider,omitempty"` + ClusterName string `json:"clusterName,omitempty" yaml:"clusterName,omitempty"` + DNS *DNSConfig `json:"dns,omitempty" yaml:"dns,omitempty"` + IgnoreDockerVersion bool `json:"ignoreDockerVersion,omitempty" yaml:"ignoreDockerVersion,omitempty"` + Ingress *IngressConfig `json:"ingress,omitempty" yaml:"ingress,omitempty"` + Monitoring *MonitoringConfig `json:"monitoring,omitempty" yaml:"monitoring,omitempty"` + Network *NetworkConfig `json:"network,omitempty" yaml:"network,omitempty"` + NodeUpgradeStrategy *NodeUpgradeStrategy `json:"nodeUpgradeStrategy,omitempty" yaml:"nodeUpgradeStrategy,omitempty"` + Nodes []RKEConfigNode `json:"nodes,omitempty" yaml:"nodes,omitempty"` + PrefixPath string `json:"prefixPath,omitempty" yaml:"prefixPath,omitempty"` + PrivateRegistries []PrivateRegistry `json:"privateRegistries,omitempty" yaml:"privateRegistries,omitempty"` + Restore *RestoreConfig `json:"restore,omitempty" yaml:"restore,omitempty"` + RotateCertificates *RotateCertificates `json:"rotateCertificates,omitempty" yaml:"rotateCertificates,omitempty"` + SSHAgentAuth bool `json:"sshAgentAuth,omitempty" yaml:"sshAgentAuth,omitempty"` + SSHCertPath string `json:"sshCertPath,omitempty" yaml:"sshCertPath,omitempty"` + SSHKeyPath string `json:"sshKeyPath,omitempty" yaml:"sshKeyPath,omitempty"` + Services *RKEConfigServices `json:"services,omitempty" yaml:"services,omitempty"` + Version string `json:"kubernetesVersion,omitempty" yaml:"kubernetesVersion,omitempty"` } diff --git a/client/management/v3/zz_generated_rolling_update_strategy.go b/client/management/v3/zz_generated_rolling_update_strategy.go new file mode 100644 index 0000000000..861524a9e3 --- /dev/null +++ b/client/management/v3/zz_generated_rolling_update_strategy.go @@ -0,0 +1,16 @@ +package client + +import "k8s.io/apimachinery/pkg/util/intstr" + +const ( + RollingUpdateStrategyType = "rollingUpdateStrategy" + RollingUpdateStrategyFieldDrain = "drain" + RollingUpdateStrategyFieldDrainInput = "nodeDrainInput" + RollingUpdateStrategyFieldMaxUnavailable = "maxUnavailable" +) + +type RollingUpdateStrategy struct { + Drain bool `json:"drain,omitempty" yaml:"drain,omitempty"` + DrainInput *NodeDrainInput `json:"nodeDrainInput,omitempty" yaml:"nodeDrainInput,omitempty"` + MaxUnavailable intstr.IntOrString `json:"maxUnavailable,omitempty" yaml:"maxUnavailable,omitempty"` +}