Add pod-annotations CLI flag to the install command (#1626)

* allow users to specify additional Velero/restic pod annotations on the command line with the pod-annotations flag

Signed-off-by: Traci Kamp <traci.kamp@gmail.com>
This commit is contained in:
Traci Kamp
2019-07-03 17:22:34 -05:00
committed by KubeKween
parent eec5cc687e
commit f829dabcf4
5 changed files with 29 additions and 4 deletions

View File

@@ -0,0 +1 @@
enhancement: allow users to specify additional Velero/Restic pod annotations on the command line with the pod-annotations flag.

View File

@@ -43,6 +43,7 @@ type InstallOptions struct {
BucketName string
Prefix string
ProviderName string
PodAnnotations flag.Map
RestoreOnly bool
SecretFile string
DryRun bool
@@ -60,6 +61,7 @@ func (o *InstallOptions) BindFlags(flags *pflag.FlagSet) {
flags.StringVar(&o.SecretFile, "secret-file", o.SecretFile, "file containing credentials for backup and volume provider")
flags.StringVar(&o.Image, "image", o.Image, "image to use for the Velero and restic server pods. Optional.")
flags.StringVar(&o.Prefix, "prefix", o.Prefix, "prefix under which all Velero data should be stored within the bucket. Optional.")
flags.Var(&o.PodAnnotations, "pod-annotations", "annotations to add to the Velero and Restic pods. Optional. Format is key1=value1,key2=value2")
flags.StringVar(&o.Namespace, "namespace", o.Namespace, "namespace to install Velero and associated data into. Optional.")
flags.Var(&o.BackupStorageConfig, "backup-location-config", "configuration to use for the backup storage location. Format is key1=value1,key2=value2")
flags.Var(&o.VolumeSnapshotConfig, "snapshot-location-config", "configuration to use for the volume snapshot location. Format is key1=value1,key2=value2")
@@ -70,13 +72,14 @@ func (o *InstallOptions) BindFlags(flags *pflag.FlagSet) {
flags.BoolVar(&o.Wait, "wait", o.Wait, "wait for Velero deployment to be ready. Optional.")
}
// NewInstallOptions instantiates a new, default InstallOptions stuct.
// NewInstallOptions instantiates a new, default InstallOptions struct.
func NewInstallOptions() *InstallOptions {
return &InstallOptions{
Namespace: api.DefaultNamespace,
Image: install.DefaultImage,
BackupStorageConfig: flag.NewMap(),
VolumeSnapshotConfig: flag.NewMap(),
PodAnnotations: flag.NewMap(),
// Default to creating a VSL unless we're told otherwise
UseVolumeSnapshots: true,
}
@@ -98,6 +101,7 @@ func (o *InstallOptions) AsVeleroOptions() (*install.VeleroOptions, error) {
ProviderName: o.ProviderName,
Bucket: o.BucketName,
Prefix: o.Prefix,
PodAnnotations: o.PodAnnotations.Data(),
SecretData: secretData,
RestoreOnly: o.RestoreOnly,
UseRestic: o.UseRestic,

View File

@@ -61,6 +61,7 @@ func DaemonSet(namespace string, opts ...podTemplateOption) *appsv1.DaemonSet {
"name": "restic",
"component": "velero",
},
Annotations: c.annotations,
},
Spec: corev1.PodSpec{
ServiceAccountName: "velero",

View File

@@ -31,6 +31,7 @@ type podTemplateConfig struct {
withoutCredentialsVolume bool
envVars []corev1.EnvVar
restoreOnly bool
annotations map[string]string
}
func WithImage(image string) podTemplateOption {
@@ -39,6 +40,12 @@ func WithImage(image string) podTemplateOption {
}
}
func WithAnnotations(annotations map[string]string) podTemplateOption {
return func(c *podTemplateConfig) {
c.annotations = annotations
}
}
func WithoutCredentialsVolume() podTemplateOption {
return func(c *podTemplateConfig) {
c.withoutCredentialsVolume = true
@@ -98,7 +105,7 @@ func Deployment(namespace string, opts ...podTemplateOption) *appsv1beta1.Deploy
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: containerLabels,
Annotations: podAnnotations(),
Annotations: podAnnotations(c.annotations),
},
Spec: corev1.PodSpec{
RestartPolicy: corev1.RestartPolicyAlways,

View File

@@ -45,12 +45,20 @@ func labels() map[string]string {
}
}
func podAnnotations() map[string]string {
return map[string]string{
func podAnnotations(userAnnotations map[string]string) map[string]string {
// Use the default annotations as a starting point
base := map[string]string{
"prometheus.io/scrape": "true",
"prometheus.io/port": "8085",
"prometheus.io/path": "/metrics",
}
// Merge base annotations with user annotations to enforce CLI precedence
for k, v := range userAnnotations {
base[k] = v
}
return base
}
func containerPorts() []corev1.ContainerPort {
@@ -180,6 +188,7 @@ type VeleroOptions struct {
ProviderName string
Bucket string
Prefix string
PodAnnotations map[string]string
SecretData []byte
RestoreOnly bool
UseRestic bool
@@ -221,10 +230,12 @@ func AllResources(o *VeleroOptions) (*unstructured.UnstructuredList, error) {
}
deploy := Deployment(o.Namespace,
WithAnnotations(o.PodAnnotations),
WithImage(o.Image),
)
if o.RestoreOnly {
deploy = Deployment(o.Namespace,
WithAnnotations(o.PodAnnotations),
WithImage(o.Image),
WithRestoreOnly(),
)
@@ -233,6 +244,7 @@ func AllResources(o *VeleroOptions) (*unstructured.UnstructuredList, error) {
if o.UseRestic {
ds := DaemonSet(o.Namespace,
WithAnnotations(o.PodAnnotations),
WithImage(o.Image),
)
appendUnstructured(resources, ds)