Skip to content

Commit

Permalink
Merge pull request #285 from linkernetworks/hwchiu/fix-wrong-ret
Browse files Browse the repository at this point in the history
[Bug] Return the Bad-Request when deleting the storage if it's used by some volume
  • Loading branch information
John-Lin authored Aug 29, 2018
2 parents abca5d8 + 425ad1e commit d29be41
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 15 deletions.
5 changes: 5 additions & 0 deletions src/server/handler_storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,11 @@ func deleteStorage(ctx *web.Context) {
return
}

if err := storageProvider.ValidateBeforeDeleting(sp, &storage); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

if err := storageProvider.DeleteStorage(sp, &storage); err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
Expand Down
9 changes: 7 additions & 2 deletions src/storageprovider/fake.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,26 @@ type FakeStorageProvider struct {
}

// ValidateBeforeCreating will validate StorageProvider before creating
func (fake FakeStorageProvider) ValidateBeforeCreating(sp *serviceprovider.Container, net *entity.Storage) error {
func (fake FakeStorageProvider) ValidateBeforeCreating(sp *serviceprovider.Container, storage *entity.Storage) error {
if fake.FakeParameter == "" {
return fmt.Errorf("Fail to validate but don't worry, I'm fake storage provider")
}
return nil
}

// CreateStorage will create storage
func (fake FakeStorageProvider) CreateStorage(sp *serviceprovider.Container, net *entity.Storage) error {
func (fake FakeStorageProvider) CreateStorage(sp *serviceprovider.Container, storage *entity.Storage) error {
if fake.IWantFail {
return fmt.Errorf("Fail to create storage but don't worry, I'm fake storage provider")
}
return nil
}

// ValidateBeforeDeleting will validate StorageProvider before deleting
func (fake FakeStorageProvider) ValidateBeforeDeleting(sp *serviceprovider.Container, net *entity.Storage) error {
return nil
}

// DeleteStorage will delete storage
func (fake FakeStorageProvider) DeleteStorage(sp *serviceprovider.Container, net *entity.Storage) error {
if fake.IWantFail {
Expand Down
29 changes: 17 additions & 12 deletions src/storageprovider/nfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,23 @@ func (nfs NFSStorageProvider) ValidateBeforeCreating(sp *serviceprovider.Contain
return nil
}

// ValidateBeforeDeleting will validate StorageProvider before deleting
func (nfs NFSStorageProvider) ValidateBeforeDeleting(sp *serviceprovider.Container, storage *entity.Storage) error {
//If the storage is used by some volume, we can't delete it.
q := bson.M{"storageName": storage.Name}
session := sp.Mongo.NewSession()
defer session.Close()

count, err := session.Count(entity.VolumeCollectionName, q)
if err != nil {
return err
} else if count > 0 {
return fmt.Errorf("The StorageName %s can't be deleted, since there're some volume still use it", storage.Name)
}

return nil
}

func getDeployment(name string, storage *entity.Storage) *appsv1.Deployment {
var replicas int32
replicas = 1
Expand Down Expand Up @@ -129,18 +146,6 @@ func (nfs NFSStorageProvider) DeleteStorage(sp *serviceprovider.Container, stora
deployName := NFSProvisionerPrefix + storage.ID.Hex()
storageName := NFSStorageClassPrefix + storage.ID.Hex()

//If the storage is used by some volume, we can't delete it.
q := bson.M{"storageName": storage.Name}
session := sp.Mongo.NewSession()
defer session.Close()

count, err := session.Count(entity.VolumeCollectionName, q)
if err != nil {
return err
} else if count > 0 {
return fmt.Errorf("The StorageName %s can't be deleted, since there're some volume still use it", storage.Name)
}

//Delete StorageClass
if err := sp.KubeCtl.DeleteStorageClass(storageName); err != nil {
return err
Expand Down
2 changes: 1 addition & 1 deletion src/storageprovider/nfs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ func (suite *StorageTestSuite) TestDeleteStorageFail() {
suite.NoError(err)
sp = sp.(NFSStorageProvider)

err = sp.DeleteStorage(suite.sp, storage)
err = sp.ValidateBeforeDeleting(suite.sp, storage)
suite.Error(err)
}

Expand Down
1 change: 1 addition & 0 deletions src/storageprovider/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
type StorageProvider interface {
ValidateBeforeCreating(sp *serviceprovider.Container, net *entity.Storage) error
CreateStorage(sp *serviceprovider.Container, net *entity.Storage) error
ValidateBeforeDeleting(sp *serviceprovider.Container, net *entity.Storage) error
DeleteStorage(sp *serviceprovider.Container, net *entity.Storage) error
}

Expand Down

0 comments on commit d29be41

Please sign in to comment.