Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions apis/stash/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,12 @@ type Recovery struct {
}

type RecoverySpec struct {
Restic string `json:"restic,omitempty"`
Workload LocalTypedReference `json:"workload,omitempty"`
PodOrdinal string `json:"podOrdinal,omitempty"`
NodeName string `json:"nodeName,omitempty"`
Volumes []core.Volume `json:"volumes,omitempty"`
Backend Backend `json:"backend,omitempty"`
Paths []string `json:"paths,omitempty"`
Workload LocalTypedReference `json:"workload,omitempty"`
PodOrdinal string `json:"podOrdinal,omitempty"`
NodeName string `json:"nodeName,omitempty"`
RecoveredVolumes []RecoveredVolume `json:"recoveredVolumes,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand All @@ -170,6 +171,12 @@ type RecoveryList struct {
Items []Recovery `json:"items,omitempty"`
}

type RecoveredVolume struct {
VolumeSource core.VolumeSource `json:",inline"`
MountPath string `json:"mountPath,omitempty"`
SubPath string `json:"subPath,omitempty"`
}

// LocalTypedReference contains enough information to let you inspect or modify the referred object.
type LocalTypedReference struct {
// Kind of the referent.
Expand Down
17 changes: 12 additions & 5 deletions apis/stash/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,12 @@ type Recovery struct {
}

type RecoverySpec struct {
Restic string `json:"restic,omitempty"`
Workload LocalTypedReference `json:"workload,omitempty"`
PodOrdinal string `json:"podOrdinal,omitempty"`
NodeName string `json:"nodeName,omitempty"`
Volumes []core.Volume `json:"volumes,omitempty"`
Backend Backend `json:"backend,omitempty"`
Paths []string `json:"paths,omitempty"`
Workload LocalTypedReference `json:"workload,omitempty"`
PodOrdinal string `json:"podOrdinal,omitempty"`
NodeName string `json:"nodeName,omitempty"`
RecoveredVolumes []RecoveredVolume `json:"recoveredVolumes,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand All @@ -170,6 +171,12 @@ type RecoveryList struct {
Items []Recovery `json:"items,omitempty"`
}

type RecoveredVolume struct {
VolumeSource core.VolumeSource `json:",inline"`
MountPath string `json:"mountPath,omitempty"`
SubPath string `json:"subPath,omitempty"`
}

// LocalTypedReference contains enough information to let you inspect or modify the referred object.
type LocalTypedReference struct {
// Kind of the referent.
Expand Down
11 changes: 7 additions & 4 deletions apis/stash/v1alpha1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,14 @@ func (r Restic) IsValid() error {
}

func (r Recovery) IsValid() error {
if r.Spec.Restic == "" {
return fmt.Errorf("missing restic name")
if r.Spec.Backend.StorageSecretName == "" {
return fmt.Errorf("missing repository secret name")
}
if len(r.Spec.Paths) == 0 {
return fmt.Errorf("missing filegroup paths")
}
if len(r.Spec.Volumes) == 0 {
return fmt.Errorf("missing target vollume")
if len(r.Spec.RecoveredVolumes) == 0 {
return fmt.Errorf("missing recovery vollume")
}

if err := r.Spec.Workload.Canonicalize(); err != nil {
Expand Down
40 changes: 36 additions & 4 deletions apis/stash/v1alpha1/zz_generated.conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ func RegisterConversions(scheme *runtime.Scheme) error {
Convert_stash_LocalSpec_To_v1alpha1_LocalSpec,
Convert_v1alpha1_LocalTypedReference_To_stash_LocalTypedReference,
Convert_stash_LocalTypedReference_To_v1alpha1_LocalTypedReference,
Convert_v1alpha1_RecoveredVolume_To_stash_RecoveredVolume,
Convert_stash_RecoveredVolume_To_v1alpha1_RecoveredVolume,
Convert_v1alpha1_Recovery_To_stash_Recovery,
Convert_stash_Recovery_To_v1alpha1_Recovery,
Convert_v1alpha1_RecoveryList_To_stash_RecoveryList,
Expand Down Expand Up @@ -247,6 +249,30 @@ func Convert_stash_LocalTypedReference_To_v1alpha1_LocalTypedReference(in *stash
return autoConvert_stash_LocalTypedReference_To_v1alpha1_LocalTypedReference(in, out, s)
}

func autoConvert_v1alpha1_RecoveredVolume_To_stash_RecoveredVolume(in *RecoveredVolume, out *stash.RecoveredVolume, s conversion.Scope) error {
out.VolumeSource = in.VolumeSource
out.MountPath = in.MountPath
out.SubPath = in.SubPath
return nil
}

// Convert_v1alpha1_RecoveredVolume_To_stash_RecoveredVolume is an autogenerated conversion function.
func Convert_v1alpha1_RecoveredVolume_To_stash_RecoveredVolume(in *RecoveredVolume, out *stash.RecoveredVolume, s conversion.Scope) error {
return autoConvert_v1alpha1_RecoveredVolume_To_stash_RecoveredVolume(in, out, s)
}

func autoConvert_stash_RecoveredVolume_To_v1alpha1_RecoveredVolume(in *stash.RecoveredVolume, out *RecoveredVolume, s conversion.Scope) error {
out.VolumeSource = in.VolumeSource
out.MountPath = in.MountPath
out.SubPath = in.SubPath
return nil
}

// Convert_stash_RecoveredVolume_To_v1alpha1_RecoveredVolume is an autogenerated conversion function.
func Convert_stash_RecoveredVolume_To_v1alpha1_RecoveredVolume(in *stash.RecoveredVolume, out *RecoveredVolume, s conversion.Scope) error {
return autoConvert_stash_RecoveredVolume_To_v1alpha1_RecoveredVolume(in, out, s)
}

func autoConvert_v1alpha1_Recovery_To_stash_Recovery(in *Recovery, out *stash.Recovery, s conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
if err := Convert_v1alpha1_RecoverySpec_To_stash_RecoverySpec(&in.Spec, &out.Spec, s); err != nil {
Expand Down Expand Up @@ -302,13 +328,16 @@ func Convert_stash_RecoveryList_To_v1alpha1_RecoveryList(in *stash.RecoveryList,
}

func autoConvert_v1alpha1_RecoverySpec_To_stash_RecoverySpec(in *RecoverySpec, out *stash.RecoverySpec, s conversion.Scope) error {
out.Restic = in.Restic
if err := Convert_v1alpha1_Backend_To_stash_Backend(&in.Backend, &out.Backend, s); err != nil {
return err
}
out.Paths = *(*[]string)(unsafe.Pointer(&in.Paths))
if err := Convert_v1alpha1_LocalTypedReference_To_stash_LocalTypedReference(&in.Workload, &out.Workload, s); err != nil {
return err
}
out.PodOrdinal = in.PodOrdinal
out.NodeName = in.NodeName
out.Volumes = *(*[]v1.Volume)(unsafe.Pointer(&in.Volumes))
out.RecoveredVolumes = *(*[]stash.RecoveredVolume)(unsafe.Pointer(&in.RecoveredVolumes))
return nil
}

Expand All @@ -318,13 +347,16 @@ func Convert_v1alpha1_RecoverySpec_To_stash_RecoverySpec(in *RecoverySpec, out *
}

func autoConvert_stash_RecoverySpec_To_v1alpha1_RecoverySpec(in *stash.RecoverySpec, out *RecoverySpec, s conversion.Scope) error {
out.Restic = in.Restic
if err := Convert_stash_Backend_To_v1alpha1_Backend(&in.Backend, &out.Backend, s); err != nil {
return err
}
out.Paths = *(*[]string)(unsafe.Pointer(&in.Paths))
if err := Convert_stash_LocalTypedReference_To_v1alpha1_LocalTypedReference(&in.Workload, &out.Workload, s); err != nil {
return err
}
out.PodOrdinal = in.PodOrdinal
out.NodeName = in.NodeName
out.Volumes = *(*[]v1.Volume)(unsafe.Pointer(&in.Volumes))
out.RecoveredVolumes = *(*[]RecoveredVolume)(unsafe.Pointer(&in.RecoveredVolumes))
return nil
}

Expand Down
33 changes: 30 additions & 3 deletions apis/stash/v1alpha1/zz_generated.deepcopy.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
in.(*LocalTypedReference).DeepCopyInto(out.(*LocalTypedReference))
return nil
}, InType: reflect.TypeOf(&LocalTypedReference{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*RecoveredVolume).DeepCopyInto(out.(*RecoveredVolume))
return nil
}, InType: reflect.TypeOf(&RecoveredVolume{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*Recovery).DeepCopyInto(out.(*Recovery))
return nil
Expand Down Expand Up @@ -285,6 +289,23 @@ func (in *LocalTypedReference) DeepCopy() *LocalTypedReference {
return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RecoveredVolume) DeepCopyInto(out *RecoveredVolume) {
*out = *in
in.VolumeSource.DeepCopyInto(&out.VolumeSource)
return
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RecoveredVolume.
func (in *RecoveredVolume) DeepCopy() *RecoveredVolume {
if in == nil {
return nil
}
out := new(RecoveredVolume)
in.DeepCopyInto(out)
return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Recovery) DeepCopyInto(out *Recovery) {
*out = *in
Expand Down Expand Up @@ -351,10 +372,16 @@ func (in *RecoveryList) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RecoverySpec) DeepCopyInto(out *RecoverySpec) {
*out = *in
in.Backend.DeepCopyInto(&out.Backend)
if in.Paths != nil {
in, out := &in.Paths, &out.Paths
*out = make([]string, len(*in))
copy(*out, *in)
}
out.Workload = in.Workload
if in.Volumes != nil {
in, out := &in.Volumes, &out.Volumes
*out = make([]v1.Volume, len(*in))
if in.RecoveredVolumes != nil {
in, out := &in.RecoveredVolumes, &out.RecoveredVolumes
*out = make([]RecoveredVolume, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
Expand Down
33 changes: 30 additions & 3 deletions apis/stash/zz_generated.deepcopy.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
in.(*LocalTypedReference).DeepCopyInto(out.(*LocalTypedReference))
return nil
}, InType: reflect.TypeOf(&LocalTypedReference{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*RecoveredVolume).DeepCopyInto(out.(*RecoveredVolume))
return nil
}, InType: reflect.TypeOf(&RecoveredVolume{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*Recovery).DeepCopyInto(out.(*Recovery))
return nil
Expand Down Expand Up @@ -285,6 +289,23 @@ func (in *LocalTypedReference) DeepCopy() *LocalTypedReference {
return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RecoveredVolume) DeepCopyInto(out *RecoveredVolume) {
*out = *in
in.VolumeSource.DeepCopyInto(&out.VolumeSource)
return
}

// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RecoveredVolume.
func (in *RecoveredVolume) DeepCopy() *RecoveredVolume {
if in == nil {
return nil
}
out := new(RecoveredVolume)
in.DeepCopyInto(out)
return out
}

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Recovery) DeepCopyInto(out *Recovery) {
*out = *in
Expand Down Expand Up @@ -351,10 +372,16 @@ func (in *RecoveryList) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RecoverySpec) DeepCopyInto(out *RecoverySpec) {
*out = *in
in.Backend.DeepCopyInto(&out.Backend)
if in.Paths != nil {
in, out := &in.Paths, &out.Paths
*out = make([]string, len(*in))
copy(*out, *in)
}
out.Workload = in.Workload
if in.Volumes != nil {
in, out := &in.Volumes, &out.Volumes
*out = make([]v1.Volume, len(*in))
if in.RecoveredVolumes != nil {
in, out := &in.RecoveredVolumes, &out.RecoveredVolumes
*out = make([]RecoveredVolume, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/backup/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func (c *Controller) setup() (*api.Restic, error) {
log.Infof("Found repository secret %s\n", secret.Name)

// setup restic-cli
if err = c.resticCLI.SetupEnv(resource, secret, c.opt.SmartPrefix); err != nil {
if err = c.resticCLI.SetupEnv(resource.Spec.Backend, secret, c.opt.SmartPrefix); err != nil {
return nil, err
}
if err = c.resticCLI.InitRepositoryIfAbsent(); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/backup/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func (c *Controller) runOnceForScheduler() error {
}

// setup restic again, previously done in setup()
if err = c.resticCLI.SetupEnv(resource, secret, c.opt.SmartPrefix); err != nil {
if err = c.resticCLI.SetupEnv(resource.Spec.Backend, secret, c.opt.SmartPrefix); err != nil {
return err
}
if err = c.resticCLI.InitRepositoryIfAbsent(); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/check/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func (c *Controller) Run() (err error) {
}

cli := cli.New("/tmp", false, c.opt.HostName)
if err = cli.SetupEnv(restic, secret, c.opt.SmartPrefix); err != nil {
if err = cli.SetupEnv(restic.Spec.Backend, secret, c.opt.SmartPrefix); err != nil {
return
}

Expand Down
5 changes: 2 additions & 3 deletions pkg/cli/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ const (
OS_AUTH_TOKEN = "OS_AUTH_TOKEN"
)

func (w *ResticWrapper) SetupEnv(resource *api.Restic, secret *core.Secret, autoPrefix string) error {
func (w *ResticWrapper) SetupEnv(backend api.Backend, secret *core.Secret, autoPrefix string) error {
if v, ok := secret.Data[RESTIC_PASSWORD]; !ok {
return errors.New("Missing repository password")
return errors.New("missing repository password")
} else {
w.sh.SetEnv(RESTIC_PASSWORD, string(v))
}
Expand All @@ -67,7 +67,6 @@ func (w *ResticWrapper) SetupEnv(resource *api.Restic, secret *core.Secret, auto
}
w.sh.SetEnv(TMPDIR, tmpDir)

backend := resource.Spec.Backend
if backend.Local != nil {
r := filepath.Join(backend.Local.Path, autoPrefix)
if err := os.MkdirAll(r, 0755); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmds/snapshot_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func (e PrometheusExporter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
err = resticCLI.SetupEnv(resource, secret, r.URL.Query().Get(QueryParamAutoPrefix))
err = resticCLI.SetupEnv(resource.Spec.Backend, secret, r.URL.Query().Get(QueryParamAutoPrefix))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
Expand Down
21 changes: 3 additions & 18 deletions pkg/controller/recoveries.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,29 +166,14 @@ func (c *StashController) runRecoveryJob(rec *api.Recovery) error {
return nil
}

restic, err := c.stashClient.Restics(rec.Namespace).Get(rec.Spec.Restic, metav1.GetOptions{})
if err != nil {
log.Errorln(err)
stash_util.SetRecoveryStatusPhase(c.stashClient, rec, api.RecoveryFailed)
c.recorder.Event(rec.ObjectReference(), core.EventTypeWarning, eventer.EventReasonFailedToRecover, err.Error())
return err
}

if err = restic.IsValid(); err != nil {
log.Errorln(err)
stash_util.SetRecoveryStatusPhase(c.stashClient, rec, api.RecoveryFailed)
c.recorder.Event(rec.ObjectReference(), core.EventTypeWarning, eventer.EventReasonFailedToRecover, err.Error())
return err
}

job := util.CreateRecoveryJob(rec, restic, c.options.SidecarImageTag)
job := util.CreateRecoveryJob(rec, c.options.SidecarImageTag)
if c.options.EnableRBAC {
if err = c.ensureRecoveryRBAC(job.Name, job.Namespace); err != nil {
if err := c.ensureRecoveryRBAC(job.Name, job.Namespace); err != nil {
return fmt.Errorf("error ensuring rbac for recovery job %s, reason: %s\n", job.Name, err)
}
job.Spec.Template.Spec.ServiceAccountName = job.Name
}
if job, err = c.k8sClient.BatchV1().Jobs(rec.Namespace).Create(job); err != nil {
if _, err := c.k8sClient.BatchV1().Jobs(rec.Namespace).Create(job); err != nil {
if kerr.IsAlreadyExists(err) {
return nil
}
Expand Down
Loading