Skip to content

Commit 02f50b9

Browse files
Wayne Witzel IIIskriss
authored andcommitted
add default-volume-snapshot-locations to server cmd
Signed-off-by: Wayne Witzel III <wayne@riotousliving.com>
1 parent 1aa712d commit 02f50b9

File tree

1 file changed

+60
-9
lines changed

1 file changed

+60
-9
lines changed

pkg/cmd/server/server.go

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import (
5555
"github.com/heptio/ark/pkg/client"
5656
"github.com/heptio/ark/pkg/cloudprovider"
5757
"github.com/heptio/ark/pkg/cmd"
58+
"github.com/heptio/ark/pkg/cmd/util/flag"
5859
"github.com/heptio/ark/pkg/cmd/util/signals"
5960
"github.com/heptio/ark/pkg/controller"
6061
arkdiscovery "github.com/heptio/ark/pkg/discovery"
@@ -80,19 +81,21 @@ type serverConfig struct {
8081
pluginDir, metricsAddress, defaultBackupLocation string
8182
backupSyncPeriod, podVolumeOperationTimeout time.Duration
8283
restoreResourcePriorities []string
84+
defaultVolumeSnapshotLocations map[string]string
8385
restoreOnly bool
8486
}
8587

8688
func NewCommand() *cobra.Command {
8789
var (
8890
logLevelFlag = logging.LogLevelFlag(logrus.InfoLevel)
8991
config = serverConfig{
90-
pluginDir: "/plugins",
91-
metricsAddress: defaultMetricsAddress,
92-
defaultBackupLocation: "default",
93-
backupSyncPeriod: defaultBackupSyncPeriod,
94-
podVolumeOperationTimeout: defaultPodVolumeOperationTimeout,
95-
restoreResourcePriorities: defaultRestorePriorities,
92+
pluginDir: "/plugins",
93+
metricsAddress: defaultMetricsAddress,
94+
defaultBackupLocation: "default",
95+
defaultVolumeSnapshotLocations: make(map[string]string),
96+
backupSyncPeriod: defaultBackupSyncPeriod,
97+
podVolumeOperationTimeout: defaultPodVolumeOperationTimeout,
98+
restoreResourcePriorities: defaultRestorePriorities,
9699
}
97100
)
98101

@@ -144,6 +147,12 @@ func NewCommand() *cobra.Command {
144147
command.Flags().StringSliceVar(&config.restoreResourcePriorities, "restore-resource-priorities", config.restoreResourcePriorities, "desired order of resource restores; any resource not in the list will be restored alphabetically after the prioritized resources")
145148
command.Flags().StringVar(&config.defaultBackupLocation, "default-backup-storage-location", config.defaultBackupLocation, "name of the default backup storage location")
146149

150+
volumeSnapshotLocations := flag.NewMap().WithKeyValueDelimiter(":")
151+
command.Flags().Var(&volumeSnapshotLocations, "default-volume-snapshot-locations", "list of unique volume providers and default volume snapshot location (provider1:location-01, provider2:location-02, ...)")
152+
if volumeSnapshotLocations.Data() != nil {
153+
config.defaultVolumeSnapshotLocations = volumeSnapshotLocations.Data()
154+
}
155+
147156
return command
148157
}
149158

@@ -277,6 +286,11 @@ func (s *server) run() error {
277286
Warnf("Default backup storage location %q not found; backups must explicitly specify a location", s.config.defaultBackupLocation)
278287
}
279288

289+
defaultVolumeSnapshotLocations, err := s.getDefaultVolumeSnapshotLocations()
290+
if err != nil {
291+
return err
292+
}
293+
280294
if config.PersistentVolumeProvider == nil {
281295
s.logger.Info("PersistentVolumeProvider config not provided, volume snapshots and restores are disabled")
282296
} else {
@@ -292,13 +306,50 @@ func (s *server) run() error {
292306
return err
293307
}
294308

295-
if err := s.runControllers(config); err != nil {
309+
if err := s.runControllers(config, defaultVolumeSnapshotLocations); err != nil {
296310
return err
297311
}
298312

299313
return nil
300314
}
301315

316+
func (s *server) getDefaultVolumeSnapshotLocations() (map[string]*api.VolumeSnapshotLocation, error) {
317+
providerDefaults := make(map[string]*api.VolumeSnapshotLocation)
318+
if len(s.config.defaultVolumeSnapshotLocations) == 0 {
319+
return providerDefaults, nil
320+
}
321+
322+
volumeSnapshotLocations, err := s.arkClient.ArkV1().VolumeSnapshotLocations(s.namespace).List(metav1.ListOptions{})
323+
if err != nil {
324+
return providerDefaults, errors.WithStack(err)
325+
}
326+
327+
providerLocations := make(map[string][]*api.VolumeSnapshotLocation)
328+
for _, vsl := range volumeSnapshotLocations.Items {
329+
providerLocations[vsl.Spec.Provider] = append(providerLocations[vsl.Spec.Provider], &vsl)
330+
}
331+
332+
for provider, locations := range providerLocations {
333+
defaultLocation, ok := s.config.defaultVolumeSnapshotLocations[provider]
334+
if !ok {
335+
return providerDefaults, errors.Errorf("missing provider %s. When using default volume snapshot locations, one must exist for every known provider.", provider)
336+
}
337+
338+
for _, location := range locations {
339+
if location.ObjectMeta.Name == defaultLocation {
340+
providerDefaults[provider] = location
341+
break
342+
}
343+
}
344+
345+
if _, ok := providerDefaults[provider]; !ok {
346+
return providerDefaults, errors.Errorf("%s is not a valid volume snapshot location for %s", defaultLocation, provider)
347+
}
348+
}
349+
350+
return providerDefaults, nil
351+
}
352+
302353
func (s *server) applyConfigDefaults(c *api.Config) {
303354
if s.config.backupSyncPeriod == 0 {
304355
s.config.backupSyncPeriod = defaultBackupSyncPeriod
@@ -572,7 +623,7 @@ func (s *server) initRestic() error {
572623
return nil
573624
}
574625

575-
func (s *server) runControllers(config *api.Config) error {
626+
func (s *server) runControllers(config *api.Config, defaultVolumeSnapshotLocations map[string]*api.VolumeSnapshotLocation) error {
576627
s.logger.Info("Starting controllers")
577628

578629
ctx := s.ctx
@@ -637,7 +688,7 @@ func (s *server) runControllers(config *api.Config) error {
637688
s.sharedInformerFactory.Ark().V1().BackupStorageLocations(),
638689
s.config.defaultBackupLocation,
639690
s.sharedInformerFactory.Ark().V1().VolumeSnapshotLocations(),
640-
nil,
691+
s.config.defaultVolumeSnapshotLocations,
641692
s.metrics,
642693
)
643694
wg.Add(1)

0 commit comments

Comments
 (0)