diff --git a/pkg/apis/upgrade.cattle.io/v1/types.go b/pkg/apis/upgrade.cattle.io/v1/types.go index 3df0e57e14a6524e49819bf68b2130f72177b122..ca6c5040179677ca5003297d9aa43833b1ff6efd 100644 --- a/pkg/apis/upgrade.cattle.io/v1/types.go +++ b/pkg/apis/upgrade.cattle.io/v1/types.go @@ -62,6 +62,13 @@ type ContainerSpec struct { Args []string `json:"args,omitempty"` Env []corev1.EnvVar `json:"envs,omitempty"` EnvFrom []corev1.EnvFromSource `json:"envFrom,omitempty"` + Volumes []VolumeSpec `json:"volumes,omitempty"` +} + +type VolumeSpec struct { + Name string `json:"name,omitempty"` + Source string `json:"source,omitempty"` + Destination string `json:"destination,omitempty"` } // DrainSpec encapsulates `kubectl drain` parameters minus node/pod selectors. diff --git a/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go b/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go index 4058839b91b4e54d3f0ca69182a0d5d8d3ea7fc0..aef229d4db48788a4f3ef8486918c4a4cc065752 100644 --- a/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go +++ b/pkg/apis/upgrade.cattle.io/v1/zz_generated_deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* @@ -56,6 +57,11 @@ func (in *ContainerSpec) DeepCopyInto(out *ContainerSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Volumes != nil { + in, out := &in.Volumes, &out.Volumes + *out = make([]VolumeSpec, len(*in)) + copy(*out, *in) + } return } @@ -255,3 +261,19 @@ func (in *SecretSpec) DeepCopy() *SecretSpec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeSpec) DeepCopyInto(out *VolumeSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeSpec. +func (in *VolumeSpec) DeepCopy() *VolumeSpec { + if in == nil { + return nil + } + out := new(VolumeSpec) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/upgrade/container/container.go b/pkg/upgrade/container/container.go index 2d70da3802e1f9c19581d19df1cfa9750c424e16..196f1ec6cb88cdf69406c217e81459135956cf74 100644 --- a/pkg/upgrade/container/container.go +++ b/pkg/upgrade/container/container.go @@ -76,6 +76,17 @@ func WithPlanEnvironment(planName string, planStatus upgradeapiv1.PlanStatus) Op } } +func WithVolumes(volumes []upgradeapiv1.VolumeSpec) Option { + return func(container *corev1.Container) { + for _, v := range volumes { + container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{ + Name: v.Name, + MountPath: v.Destination, + }) + } + } +} + func New(name string, spec upgradeapiv1.ContainerSpec, opt ...Option) corev1.Container { container := corev1.Container{ Name: name, @@ -110,6 +121,7 @@ func New(name string, spec upgradeapiv1.ContainerSpec, opt ...Option) corev1.Con }}, spec.Env...), EnvFrom: spec.EnvFrom, } + for _, fn := range opt { fn(&container) } diff --git a/pkg/upgrade/job/job.go b/pkg/upgrade/job/job.go index 93b347595f4afab527cef5a630cc4941d6280695..2e1050fc73d593272ab936a4e1d4099ee3a3119b 100644 --- a/pkg/upgrade/job/job.go +++ b/pkg/upgrade/job/job.go @@ -212,6 +212,18 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat }) } + // add volumes from upgrade plan + for _, v := range plan.Spec.Upgrade.Volumes { + podTemplate.Spec.Volumes = append(podTemplate.Spec.Volumes, corev1.Volume{ + Name: v.Name, + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: v.Source, + }, + }, + }) + } + // first, we prepare if plan.Spec.Prepare != nil { podTemplate.Spec.InitContainers = append(podTemplate.Spec.InitContainers, @@ -220,6 +232,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat upgradectr.WithSecrets(plan.Spec.Secrets), upgradectr.WithPlanEnvironment(plan.Name, plan.Status), upgradectr.WithImagePullPolicy(ImagePullPolicy), + upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes), ), ) } @@ -260,6 +273,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat upgradectr.WithSecrets(plan.Spec.Secrets), upgradectr.WithPlanEnvironment(plan.Name, plan.Status), upgradectr.WithImagePullPolicy(ImagePullPolicy), + upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes), ), ) } else if cordon { @@ -271,6 +285,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat upgradectr.WithSecrets(plan.Spec.Secrets), upgradectr.WithPlanEnvironment(plan.Name, plan.Status), upgradectr.WithImagePullPolicy(ImagePullPolicy), + upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes), ), ) } @@ -290,6 +305,7 @@ func New(plan *upgradeapiv1.Plan, node *corev1.Node, controllerName string) *bat upgradectr.WithSecrets(plan.Spec.Secrets), upgradectr.WithPlanEnvironment(plan.Name, plan.Status), upgradectr.WithImagePullPolicy(ImagePullPolicy), + upgradectr.WithVolumes(plan.Spec.Upgrade.Volumes), ), }