Skip to content

Commit f96852f

Browse files
suaas21tamalsaha
authored andcommitted
Fixed volumeSnapshot Error Issue (#819)
* add all * go fmt
1 parent 08b0f50 commit f96852f

File tree

2 files changed

+80
-39
lines changed

2 files changed

+80
-39
lines changed

pkg/cmds/restore_volumesnapshot.go

Lines changed: 70 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/appscode/go/types"
1010
vs_cs "github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned"
1111
"github.com/spf13/cobra"
12-
corev1 "k8s.io/api/core/v1"
12+
core "k8s.io/api/core/v1"
1313
storage_api_v1 "k8s.io/api/storage/v1"
1414
kerr "k8s.io/apimachinery/pkg/api/errors"
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -24,12 +24,6 @@ import (
2424
"stash.appscode.dev/stash/pkg/util"
2525
)
2626

27-
type PVC struct {
28-
podOrdinal *int32
29-
pvcName string
30-
pvc corev1.PersistentVolumeClaim
31-
}
32-
3327
func NewCmdRestoreVolumeSnapshot() *cobra.Command {
3428
var (
3529
masterURL string
@@ -85,40 +79,56 @@ func (opt *VSoption) RestoreVolumeSnapshot() error {
8579
return fmt.Errorf("restoreSession Target is nil")
8680
}
8781

88-
pvcData := []PVC{}
82+
pvcList := make([]core.PersistentVolumeClaim, 0)
8983

9084
if restoreSession.Spec.Target.Replicas == nil {
91-
for _, vol := range restoreSession.Spec.Target.VolumeClaimTemplates {
92-
pvcData = append(pvcData, PVC{pvcName: vol.Name, pvc: vol})
93-
85+
pvcs, err := opt.getPVCFromVolumeClaimTemplates(-1, restoreSession.Spec.Target.VolumeClaimTemplates, startTime)
86+
if err != nil {
87+
return err
9488
}
89+
pvcList = append(pvcList, pvcs...)
9590
} else {
96-
for i := int32(0); i < *restoreSession.Spec.Target.Replicas; i++ {
97-
for _, vol := range restoreSession.Spec.Target.VolumeClaimTemplates {
98-
pvcData = append(pvcData, PVC{pvcName: vol.Name, podOrdinal: types.Int32P(i), pvc: vol})
91+
for ordinal := int32(0); ordinal < *restoreSession.Spec.Target.Replicas; ordinal++ {
92+
pvcs, err := opt.getPVCFromVolumeClaimTemplates(ordinal, restoreSession.Spec.Target.VolumeClaimTemplates, startTime)
93+
if err != nil {
94+
return err
9995
}
96+
pvcList = append(pvcList, pvcs...)
10097
}
101-
10298
}
10399

104-
objectMeta := []metav1.ObjectMeta{}
105100
pvcAllReadyExists := false
101+
volumeSnapshotExists := false
106102

107-
for _, data := range pvcData {
108-
pvc := opt.getPVCDefinition(data)
103+
for _, pvc := range pvcList {
109104

105+
_, err = opt.snapshotClient.VolumesnapshotV1alpha1().VolumeSnapshots(opt.namespace).Get(pvc.Spec.DataSource.Name, metav1.GetOptions{})
106+
if err != nil {
107+
volumeSnapshotExists = true
108+
// write failure event for not existing volumeSnapshot
109+
restoreOutput := restic.RestoreOutput{
110+
HostRestoreStats: v1beta1.HostRestoreStats{
111+
Hostname: pvc.Name,
112+
Phase: v1beta1.HostRestoreFailed,
113+
Error: fmt.Sprintf("%s not exixts", pvc.Spec.DataSource.Name),
114+
},
115+
}
116+
err := opt.updateRestoreSessionStatus(restoreOutput, startTime)
117+
if err != nil {
118+
return err
119+
}
120+
continue
121+
}
110122
_, err = opt.kubeClient.CoreV1().PersistentVolumeClaims(opt.namespace).Get(pvc.Name, metav1.GetOptions{})
111123
if err != nil {
112124
if kerr.IsNotFound(err) {
113-
pvc, err := opt.kubeClient.CoreV1().PersistentVolumeClaims(opt.namespace).Create(pvc)
125+
_, err := opt.kubeClient.CoreV1().PersistentVolumeClaims(opt.namespace).Create(&pvc)
114126
if err != nil {
115127
return err
116128
}
117-
objectMeta = append(objectMeta, pvc.ObjectMeta)
118129
} else {
119130
return err
120131
}
121-
122132
} else {
123133
// write failure event for existing PVC
124134
pvcAllReadyExists = true
@@ -135,20 +145,21 @@ func (opt *VSoption) RestoreVolumeSnapshot() error {
135145
}
136146
}
137147
}
138-
if pvcAllReadyExists {
148+
149+
if pvcAllReadyExists || volumeSnapshotExists {
139150
return nil
140151
}
141152

142-
for i, data := range pvcData {
143-
storageClass, err := opt.kubeClient.StorageV1().StorageClasses().Get(types.String(data.pvc.Spec.StorageClassName), metav1.GetOptions{})
153+
for _, pvc := range pvcList {
154+
storageClass, err := opt.kubeClient.StorageV1().StorageClasses().Get(types.String(pvc.Spec.StorageClassName), metav1.GetOptions{})
144155
if err != nil {
145156
return err
146157
}
147158
if *storageClass.VolumeBindingMode != storage_api_v1.VolumeBindingImmediate {
148159
// write failure event because of VolumeBindingMode is WaitForFirstConsumer
149160
restoreOutput := restic.RestoreOutput{
150161
HostRestoreStats: v1beta1.HostRestoreStats{
151-
Hostname: objectMeta[i].Name,
162+
Hostname: pvc.Name,
152163
Phase: v1beta1.HostRestoreUnknown,
153164
Error: fmt.Sprintf("VolumeBindingMode is 'WaitForFirstConsumer'. Stash is unable to decide wheather the restore has succeeded or not as the PVC will not bind with respective PV until any workload mount it."),
154165
},
@@ -160,13 +171,13 @@ func (opt *VSoption) RestoreVolumeSnapshot() error {
160171
continue
161172
}
162173

163-
err = util.WaitUntilPVCReady(opt.kubeClient, objectMeta[i])
174+
err = util.WaitUntilPVCReady(opt.kubeClient, pvc.ObjectMeta)
164175
if err != nil {
165176
return err
166177
}
167178
restoreOutput := restic.RestoreOutput{
168179
HostRestoreStats: v1beta1.HostRestoreStats{
169-
Hostname: objectMeta[i].Name,
180+
Hostname: pvc.Name,
170181
Phase: v1beta1.HostRestoreSucceeded,
171182
},
172183
}
@@ -178,20 +189,40 @@ func (opt *VSoption) RestoreVolumeSnapshot() error {
178189
return nil
179190
}
180191

181-
func (opt *VSoption) getPVCDefinition(data PVC) *corev1.PersistentVolumeClaim {
182-
inputs := make(map[string]string)
183-
if data.podOrdinal == nil {
184-
data.pvc.Name = data.pvcName
185-
} else {
186-
data.pvc.Name = fmt.Sprintf("%v-%v", data.pvcName, *data.podOrdinal)
187-
inputs["POD_ORDINAL"] = strconv.Itoa(int(*data.podOrdinal))
192+
func (opt *VSoption) getPVCFromVolumeClaimTemplates(ordinal int32, claimTemplates []core.PersistentVolumeClaim, startTime time.Time) ([]core.PersistentVolumeClaim, error) {
193+
pvcList := make([]core.PersistentVolumeClaim, 0)
194+
195+
for _, claim := range claimTemplates {
196+
pvc, err := opt.getPVCDefinition(ordinal, claim)
197+
if err != nil {
198+
// write failure event
199+
restoreOutput := restic.RestoreOutput{
200+
HostRestoreStats: v1beta1.HostRestoreStats{
201+
Hostname: pvc.Name,
202+
Phase: v1beta1.HostRestoreFailed,
203+
Error: err.Error(),
204+
},
205+
}
206+
err := opt.updateRestoreSessionStatus(restoreOutput, startTime)
207+
return pvcList, err
208+
}
209+
pvc.Namespace = opt.namespace
210+
pvcList = append(pvcList, pvc)
188211
}
189-
inputs["CLAIM_NAME"] = data.pvcName
190-
err := resolve.ResolvePVCSpec(&data.pvc, inputs)
191-
if err != nil {
192-
return nil
212+
return pvcList, nil
213+
}
214+
215+
func (opt *VSoption) getPVCDefinition(ordinal int32, claim core.PersistentVolumeClaim) (core.PersistentVolumeClaim, error) {
216+
inputs := make(map[string]string)
217+
inputs["POD_ORDINAL"] = strconv.Itoa(int(ordinal))
218+
inputs["CLAIM_NAME"] = claim.Name
219+
if ordinal != int32(-1) {
220+
claim.Name = fmt.Sprintf("%v-%v", claim.Name, ordinal)
193221
}
194-
return &data.pvc
222+
dataSource := claim.Spec.DataSource
223+
err := resolve.ResolvePVCSpec(&claim, inputs)
224+
claim.Spec.DataSource = dataSource
225+
return claim, err
195226
}
196227

197228
func (opt *VSoption) updateRestoreSessionStatus(restoreOutput restic.RestoreOutput, startTime time.Time) error {

pkg/rbac/volume_snapshot.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ func ensureVolumeSnapshotRestorerJobClusterRole(kubeClient kubernetes.Interface,
174174
Resources: []string{"storageclasses"},
175175
Verbs: []string{"get"},
176176
},
177+
{
178+
APIGroups: []string{crdv1.GroupName},
179+
Resources: []string{"volumesnapshots"},
180+
Verbs: []string{"get"},
181+
},
177182
}
178183
return in
179184

@@ -226,6 +231,11 @@ func ensureStorageReaderClassClusterRole(kubeClient kubernetes.Interface, labels
226231
Resources: []string{"storageclasses"},
227232
Verbs: []string{"get"},
228233
},
234+
{
235+
APIGroups: []string{crdv1.GroupName},
236+
Resources: []string{"volumesnapshots"},
237+
Verbs: []string{"get"},
238+
},
229239
}
230240
return in
231241

0 commit comments

Comments
 (0)