diff --git a/pkg/dock/discovery/discovery.go b/pkg/dock/discovery/discovery.go index de22090c5..2f22d6eff 100755 --- a/pkg/dock/discovery/discovery.go +++ b/pkg/dock/discovery/discovery.go @@ -155,15 +155,9 @@ func (pdd *provisionDockDiscoverer) Discover() error { if err != nil { return fmt.Errorf("can not read pools in db") } - dbPolsMap := make(map[string]map[string]*model.StoragePoolSpec) - for _, dck := range pdd.dcks { - dbPolsMap[dck.Id] = make(map[string]*model.StoragePoolSpec) - } + dbPolsMap := make(map[string]*model.StoragePoolSpec) for _, polInDb := range polsInDb { - if dbPolsMap[polInDb.DockId] != nil { - polInDb.Status = unavailableStatus - dbPolsMap[polInDb.DockId][polInDb.Id] = polInDb - } + dbPolsMap[polInDb.Id] = polInDb } for _, dck := range pdd.dcks { // Call function of StorageDrivers configured by storage drivers. @@ -173,7 +167,7 @@ func (pdd *provisionDockDiscoverer) Discover() error { pols, err = d.ListPools() for _, pol := range pols { log.Infof("Backend %s discovered pool %s", dck.DriverName, pol.Name) - delete(dbPolsMap[dck.Id], pol.Id) + delete(dbPolsMap, pol.Id) pol.DockId = dck.Id pol.Status = availableStatus } @@ -199,7 +193,7 @@ func (pdd *provisionDockDiscoverer) Discover() error { pol.Id = pools[0].Id } - delete(dbPolsMap[dck.Id], pol.Id) + delete(dbPolsMap, pol.Id) pol.DockId = dck.Id pol.ReplicationType = replicationType pol.ReplicationDriverName = replicationDriverName @@ -216,11 +210,13 @@ func (pdd *provisionDockDiscoverer) Discover() error { } pdd.pols = append(pdd.pols, pols...) - for _, pol := range dbPolsMap[dck.Id] { - pdd.pols = append(pdd.pols, pol) - } } + // The rest of pools in db should be unavailable pools + for _, pol := range dbPolsMap { + pol.Status = unavailableStatus + pdd.pols = append(pdd.pols, pol) + } if len(pdd.pols) == 0 { return fmt.Errorf("there is no pool can be found") } diff --git a/pkg/dock/discovery/discovery_test.go b/pkg/dock/discovery/discovery_test.go index 5a137f292..66172a348 100644 --- a/pkg/dock/discovery/discovery_test.go +++ b/pkg/dock/discovery/discovery_test.go @@ -79,14 +79,20 @@ func TestInit(t *testing.T) { func TestDiscover(t *testing.T) { var fdd = NewFakeDockDiscoverer() var expected []*model.StoragePoolSpec + var dbPols []*model.StoragePoolSpec for i := range SampleDocks { fdd.dcks = append(fdd.dcks, &SampleDocks[i]) } for i := range SamplePools { - fdd.pols = append(fdd.pols, &SamplePools[i]) + dbPols = append(dbPols, &SamplePools[i]) expected = append(expected, &SamplePools[i]) } + // Add unavailable pool + for i := range UnavailablePools { + dbPols = append(dbPols, &UnavailablePools[i]) + expected = append(expected, &UnavailablePools[i]) + } m1 := map[string][]string{ "Name": {SamplePools[0].Name}, "DockId": {""}, @@ -101,10 +107,10 @@ func TestDiscover(t *testing.T) { } mockClient := new(dbtest.Client) - mockClient.On("ListPools", c.NewAdminContext()).Return(fdd.pols, nil) - mockClient.On("ListPoolsWithFilter", c.NewAdminContext(), m1).Return(expected, nil) - mockClient.On("ListPoolsWithFilter", c.NewAdminContext(), m2).Return(expected, nil) - mockClient.On("ListPoolsWithFilter", c.NewAdminContext(), m3).Return(expected, nil) + mockClient.On("ListPools", c.NewAdminContext()).Return(dbPols, nil) + mockClient.On("ListPoolsWithFilter", c.NewAdminContext(), m1).Return([]*model.StoragePoolSpec{&SamplePools[0]}, nil) + mockClient.On("ListPoolsWithFilter", c.NewAdminContext(), m2).Return([]*model.StoragePoolSpec{&SamplePools[1]}, nil) + mockClient.On("ListPoolsWithFilter", c.NewAdminContext(), m3).Return([]*model.StoragePoolSpec{&SamplePools[2]}, nil) fdd.c = mockClient if err := fdd.Discover(); err != nil { @@ -116,6 +122,16 @@ func TestDiscover(t *testing.T) { if !reflect.DeepEqual(fdd.pols, expected) { t.Errorf("Expected %+v, got %+v\n", expected, fdd.pols) } + for i := 0; i < len(SamplePools); i++ { + if fdd.pols[i].Status != "available" { + t.Errorf("Expected available, got %s, pool name is %s\n", fdd.pols[i].Status, fdd.pols[i].Name) + } + } + for i := len(SamplePools); i < len(SamplePools)+len(UnavailablePools); i++ { + if fdd.pols[i].Status != "unavailable" { + t.Errorf("Expected unavailable, got %s, pool name is %s\n", fdd.pols[i].Status, fdd.pols[i].Name) + } + } } func TestReport(t *testing.T) { diff --git a/testutils/collection/data.go b/testutils/collection/data.go index 147377827..fc81973cb 100644 --- a/testutils/collection/data.go +++ b/testutils/collection/data.go @@ -254,6 +254,41 @@ var ( }, } + UnavailablePools = []model.StoragePoolSpec{ + { + BaseModel: &model.BaseModel{ + Id: "084bf71e-a102-11e7-88a8-e31fe6d52249", + }, + Name: "unavailable pool", + Description: "This is the first sample storage pool for testing", + StorageType: "block", + TotalCapacity: int64(100), + FreeCapacity: int64(90), + DockId: "b7602e18-771e-11e7-8f38-dbd6d291f4e0", + AvailabilityZone: "default", + MultiAttach: true, + Extras: model.StoragePoolExtraSpec{ + DataStorage: model.DataStorageLoS{ + ProvisioningPolicy: "Thin", + Compression: true, + Deduplication: false, + }, + IOConnectivity: model.IOConnectivityLoS{ + AccessProtocol: "rbd", + MaxIOPS: 8000000, + MaxBWS: 700, + MinIOPS: 1000000, + MinBWS: 100, + Latency: 100, + }, + Advanced: map[string]interface{}{ + "diskType": "SSD", + "latency": "3ms", + }, + }, + }, + } + SampleAvailabilityZones = []string{"default"} SampleFileShares = []model.FileShareSpec{