Skip to content

Commit 1830d4f

Browse files
authored
Merge pull request #2036 from paccolamano/feat/2035
feat/2035: update asm in hostdata
2 parents fc674ea + 2ed5299 commit 1830d4f

11 files changed

+165
-58
lines changed

api-service/controller/oracle_database_disk_groups.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,23 @@ import (
2222
"github.com/ercole-io/ercole/v2/api-service/dto"
2323
"github.com/ercole-io/ercole/v2/utils"
2424
"github.com/golang/gddo/httputil"
25+
"github.com/gorilla/mux"
2526
)
2627

2728
func (ctrl *APIController) GetOracleDiskGroups(w http.ResponseWriter, r *http.Request) {
29+
hostname := mux.Vars(r)["hostname"]
30+
dbname := mux.Vars(r)["dbname"]
31+
32+
res, err := ctrl.Service.GetOracleDiskGroups(hostname, dbname)
33+
if err != nil {
34+
utils.WriteAndLogError(ctrl.Log, w, http.StatusUnprocessableEntity, err)
35+
return
36+
}
37+
38+
utils.WriteJSONResponse(w, http.StatusOK, res)
39+
}
40+
41+
func (ctrl *APIController) ListOracleDiskGroups(w http.ResponseWriter, r *http.Request) {
2842
choice := httputil.NegotiateContentType(r, []string{"application/json", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, "application/json")
2943

3044
filter, err := dto.GetGlobalFilter(r)
@@ -35,15 +49,15 @@ func (ctrl *APIController) GetOracleDiskGroups(w http.ResponseWriter, r *http.Re
3549

3650
switch choice {
3751
case "application/json":
38-
result, err := ctrl.GetOracleDiskGroupsJSON(filter)
52+
result, err := ctrl.listOracleDiskGroupsJSON(filter)
3953
if err != nil {
4054
utils.WriteAndLogError(ctrl.Log, w, http.StatusUnprocessableEntity, err)
4155
return
4256
}
4357

4458
utils.WriteJSONResponse(w, http.StatusOK, result)
4559
case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
46-
result, err := ctrl.GetOracleDiskGroupsXLSX(filter)
60+
result, err := ctrl.listOracleDiskGroupsXLSX(filter)
4761
if err != nil {
4862
utils.WriteAndLogError(ctrl.Log, w, http.StatusUnprocessableEntity, err)
4963
return
@@ -53,10 +67,10 @@ func (ctrl *APIController) GetOracleDiskGroups(w http.ResponseWriter, r *http.Re
5367
}
5468
}
5569

56-
func (ctrl *APIController) GetOracleDiskGroupsJSON(filters *dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error) {
57-
return ctrl.Service.GetOracleDiskGroups(*filters)
70+
func (ctrl *APIController) listOracleDiskGroupsJSON(filters *dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error) {
71+
return ctrl.Service.ListOracleDiskGroups(*filters)
5872
}
5973

60-
func (ctrl *APIController) GetOracleDiskGroupsXLSX(filters *dto.GlobalFilter) (*excelize.File, error) {
74+
func (ctrl *APIController) listOracleDiskGroupsXLSX(filters *dto.GlobalFilter) (*excelize.File, error) {
6175
return ctrl.Service.CreateOracleDiskGroupsXLSX(*filters)
6276
}

api-service/controller/routing.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ func (ctrl *APIController) setupProtectedRoutes(router *mux.Router) {
150150
router.HandleFunc("/hosts/technologies/oracle/databases/backup-list", ctrl.GetOracleBackupList).Methods("GET")
151151
router.HandleFunc("/hosts/technologies/oracle/databases/service-list", ctrl.GetOracleServiceList).Methods("GET")
152152
router.HandleFunc("/hosts/technologies/oracle/databases/partitionings", ctrl.ListOracleDatabasePartitionings).Methods("GET")
153-
router.HandleFunc("/hosts/technologies/oracle/databases/diskgroups", ctrl.GetOracleDiskGroups).Methods("GET")
153+
154+
router.HandleFunc("/hosts/{hostname}/technologies/oracle/databases/{dbname}/diskgroups", ctrl.GetOracleDiskGroups).Methods("GET")
155+
router.HandleFunc("/hosts/technologies/oracle/databases/diskgroups", ctrl.ListOracleDiskGroups).Methods("GET")
154156

155157
router.HandleFunc("/hosts/{hostname}/technologies/oracle/databases/{dbname}/psql-migrabilities", ctrl.GetOraclePsqlMigrabilities).Methods("GET")
156158
router.HandleFunc("/hosts/{hostname}/technologies/oracle/databases/{dbname}/psql-migrabilities/semaphore", ctrl.GetOraclePsqlMigrabilitiesSemaphore).Methods("GET")

api-service/database/database.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ type MongoDatabaseInterface interface {
162162
FindAllOracleDatabasePartitionings(filter dto.GlobalFilter) ([]dto.OracleDatabasePartitioning, error)
163163
FindAllOraclePDBPartitionings(filter dto.GlobalFilter) ([]dto.OracleDatabasePartitioning, error)
164164
FindOraclePDBChangesByHostname(filter dto.GlobalFilter, hostname string, start time.Time, end time.Time) ([]dto.OraclePdbChange, error)
165-
GetOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error)
165+
ListOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error)
166+
GetOracleDiskGroups(hostname string, dbname string) ([]dto.OracleDatabaseDiskGroupDto, error)
166167

167168
// ReplaceHostData adds a new hostdata to the database
168169
ReplaceHostData(hostData model.HostDataBE) error

api-service/database/oracle_database_disk_groups.go

Lines changed: 72 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,47 +18,87 @@ package database
1818
import (
1919
"context"
2020

21-
"github.com/amreo/mu"
2221
"github.com/ercole-io/ercole/v2/api-service/dto"
2322
"github.com/ercole-io/ercole/v2/utils"
2423
"go.mongodb.org/mongo-driver/bson"
2524
)
2625

27-
func (md *MongoDatabase) GetOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error) {
26+
func (md *MongoDatabase) GetOracleDiskGroups(hostname string, dbname string) ([]dto.OracleDatabaseDiskGroupDto, error) {
27+
return md.load(dto.GlobalFilter{}, hostname, dbname)
28+
}
29+
30+
func (md *MongoDatabase) ListOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error) {
31+
return md.load(filter, "", "")
32+
}
33+
34+
func (md *MongoDatabase) load(filter dto.GlobalFilter, hostname string, dbname string) ([]dto.OracleDatabaseDiskGroupDto, error) {
2835
ctx := context.TODO()
2936

37+
percentage := func(amount interface{}, total string) bson.M {
38+
return bson.M{
39+
"$cond": bson.A{
40+
bson.M{"$eq": bson.A{total, 0}},
41+
0,
42+
bson.M{"$round": bson.A{
43+
bson.M{"$multiply": bson.A{
44+
bson.M{"$divide": bson.A{amount, total}},
45+
100,
46+
}},
47+
2,
48+
}},
49+
},
50+
}
51+
}
52+
53+
var pipeline bson.A
54+
55+
if hostname != "" {
56+
pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.M{"hostname": hostname}}})
57+
}
58+
59+
if filter.OlderThan != utils.MAX_TIME && !filter.OlderThan.IsZero() {
60+
pipeline = append(pipeline, FilterByOldnessSteps(filter.OlderThan)...)
61+
}
62+
63+
if filter.Location != "" || filter.Environment != "" {
64+
loc := FilterByLocationAndEnvironmentSteps(filter.Location, filter.Environment).(bson.A)
65+
pipeline = append(pipeline, loc...)
66+
}
67+
68+
pipeline = append(pipeline,
69+
bson.D{{Key: "$match", Value: bson.M{"archived": false}}},
70+
bson.D{{Key: "$unwind", Value: bson.M{"path": "$features.oracle.database.databases"}}},
71+
bson.D{{Key: "$unwind", Value: bson.M{"path": "$features.oracle.database.databases.diskGroups"}}},
72+
bson.D{{Key: "$group", Value: bson.M{
73+
"_id": bson.M{
74+
"hostname": "$hostname",
75+
"diskGroupName": "$features.oracle.database.databases.diskGroups.diskGroupName",
76+
},
77+
"hostname": bson.M{"$first": "$hostname"},
78+
"databases": bson.M{"$addToSet": "$features.oracle.database.databases.name"},
79+
"diskGroupName": bson.M{"$first": "$features.oracle.database.databases.diskGroups.diskGroupName"},
80+
"totalSpace": bson.M{"$first": "$features.oracle.database.databases.diskGroups.totalSpace"},
81+
"freeSpace": bson.M{"$first": "$features.oracle.database.databases.diskGroups.freeSpace"},
82+
}}},
83+
bson.D{{Key: "$project", Value: bson.M{
84+
"_id": 0,
85+
"hostname": 1,
86+
"databases": 1,
87+
"oracleDatabaseDiskGroup.diskGroupName": "$diskGroupName",
88+
"oracleDatabaseDiskGroup.totalSpace": "$totalSpace",
89+
"oracleDatabaseDiskGroup.freeSpace": "$freeSpace",
90+
"percentageFreeSpace": percentage("$freeSpace", "$totalSpace"),
91+
"usedSpace": bson.M{"$subtract": bson.A{"$totalSpace", "$freeSpace"}},
92+
"percentageUsedSpace": percentage(bson.M{"$subtract": bson.A{"$totalSpace", "$freeSpace"}}, "$totalSpace"),
93+
}}})
94+
95+
if dbname != "" {
96+
pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.M{"databases": dbname}}})
97+
}
98+
3099
result := make([]dto.OracleDatabaseDiskGroupDto, 0)
31100

32-
cur, err := md.Client.Database(md.Config.Mongodb.DBName).Collection("hosts").Aggregate(
33-
ctx,
34-
mu.MAPipeline(
35-
FilterByOldnessSteps(filter.OlderThan),
36-
FilterByLocationAndEnvironmentSteps(filter.Location, filter.Environment),
37-
bson.M{"$unwind": bson.M{"path": "$features.oracle.database.databases"}},
38-
bson.M{"$unwind": bson.M{"path": "$features.oracle.database.databases.diskGroups"}},
39-
bson.M{"$group": bson.M{
40-
"_id": bson.M{
41-
"hostname": "$hostname",
42-
"diskGroupName": "$features.oracle.database.databases.diskGroups.diskGroupName",
43-
},
44-
"hostname": bson.M{"$first": "$hostname"},
45-
"databases": bson.M{"$addToSet": "$features.oracle.database.databases.name"},
46-
"diskGroupName": bson.M{"$first": "$features.oracle.database.databases.diskGroups.diskGroupName"},
47-
"totalSpace": bson.M{"$first": "$features.oracle.database.databases.diskGroups.totalSpace"},
48-
"freeSpace": bson.M{"$first": "$features.oracle.database.databases.diskGroups.freeSpace"},
49-
"usedSpace": bson.M{"$first": "$features.oracle.database.databases.diskGroups.usedSpace"},
50-
}},
51-
bson.M{"$project": bson.M{
52-
"_id": 0,
53-
"hostname": 1,
54-
"databases": 1,
55-
"oracleDatabaseDiskGroup.diskGroupName": "$diskGroupName",
56-
"oracleDatabaseDiskGroup.totalSpace": "$totalSpace",
57-
"oracleDatabaseDiskGroup.freeSpace": "$freeSpace",
58-
"oracleDatabaseDiskGroup.usedSpace": "$usedSpace",
59-
}},
60-
),
61-
)
101+
cur, err := md.Client.Database(md.Config.Mongodb.DBName).Collection("hosts").Aggregate(ctx, pipeline)
62102
if err != nil {
63103
return nil, utils.NewError(err, "DB ERROR")
64104
}

api-service/dto/oracle_database_disk_group.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import "github.com/ercole-io/ercole/v2/model"
1919

2020
type OracleDatabaseDiskGroupDto struct {
2121
model.OracleDatabaseDiskGroup `bson:"oracleDatabaseDiskGroup"`
22+
PercentageFreeSpace float64 `json:"percentageFreeSpace" bson:"percentageFreeSpace"`
23+
UsedSpace float64 `json:"usedSpace" bson:"usedSpace"`
24+
PercentageUsedSpace float64 `json:"percentageUsedSpace" bson:"percentageUsedSpace"`
2225
Hostname string `json:"hostname" bson:"hostname"`
2326
Databases []string `json:"databases" bson:"databases"`
2427
}

api-service/service/oracle_database_disk_groups.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,17 @@ import (
2121
"github.com/ercole-io/ercole/v2/utils/exutils"
2222
)
2323

24-
func (as *APIService) GetOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error) {
25-
result, err := as.Database.GetOracleDiskGroups(filter)
24+
func (as *APIService) GetOracleDiskGroups(hostname string, dbname string) ([]dto.OracleDatabaseDiskGroupDto, error) {
25+
result, err := as.Database.GetOracleDiskGroups(hostname, dbname)
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
return result, nil
31+
}
32+
33+
func (as *APIService) ListOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error) {
34+
result, err := as.Database.ListOracleDiskGroups(filter)
2635
if err != nil {
2736
return nil, err
2837
}
@@ -31,7 +40,7 @@ func (as *APIService) GetOracleDiskGroups(filter dto.GlobalFilter) ([]dto.Oracle
3140
}
3241

3342
func (as *APIService) CreateOracleDiskGroupsXLSX(filter dto.GlobalFilter) (*excelize.File, error) {
34-
result, err := as.Database.GetOracleDiskGroups(filter)
43+
result, err := as.Database.ListOracleDiskGroups(filter)
3544
if err != nil {
3645
return nil, err
3746
}
@@ -42,8 +51,10 @@ func (as *APIService) CreateOracleDiskGroupsXLSX(filter dto.GlobalFilter) (*exce
4251
"Databases",
4352
"Disk group name",
4453
"Total space",
45-
"Used space",
4654
"Free space",
55+
"Percentage of free space",
56+
"Used space",
57+
"Percentage of used space",
4758
}
4859

4960
sheets, err := exutils.NewXLSX(as.Config, sheet, headers...)
@@ -59,8 +70,10 @@ func (as *APIService) CreateOracleDiskGroupsXLSX(filter dto.GlobalFilter) (*exce
5970
sheets.SetCellValue(sheet, nextAxis(), val.Databases)
6071
sheets.SetCellValue(sheet, nextAxis(), val.OracleDatabaseDiskGroup.DiskGroupName)
6172
sheets.SetCellValue(sheet, nextAxis(), val.OracleDatabaseDiskGroup.TotalSpace)
62-
sheets.SetCellValue(sheet, nextAxis(), val.OracleDatabaseDiskGroup.UsedSpace)
6373
sheets.SetCellValue(sheet, nextAxis(), val.OracleDatabaseDiskGroup.FreeSpace)
74+
sheets.SetCellValue(sheet, nextAxis(), val.PercentageFreeSpace)
75+
sheets.SetCellValue(sheet, nextAxis(), val.UsedSpace)
76+
sheets.SetCellValue(sheet, nextAxis(), val.PercentageUsedSpace)
6477
}
6578

6679
return sheets, err

api-service/service/oracle_database_disk_groups_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
"go.uber.org/mock/gomock"
2929
)
3030

31-
func TestGetOracleDiskGroups_Success(t *testing.T) {
31+
func TestListOracleDiskGroups_Success(t *testing.T) {
3232
mockCtrl := gomock.NewController(t)
3333
defer mockCtrl.Finish()
3434
db := NewMockMongoDatabaseInterface(mockCtrl)
@@ -47,19 +47,18 @@ func TestGetOracleDiskGroups_Success(t *testing.T) {
4747
OracleDatabaseDiskGroup: model.OracleDatabaseDiskGroup{
4848
DiskGroupName: "disk one",
4949
TotalSpace: 100,
50-
UsedSpace: 25,
5150
FreeSpace: 75,
5251
},
5352
},
5453
}
55-
db.EXPECT().GetOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME}).Return(expected, nil)
54+
db.EXPECT().ListOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME}).Return(expected, nil)
5655

57-
res, err := as.GetOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME})
56+
res, err := as.ListOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME})
5857
require.NoError(t, err)
5958
assert.Equal(t, expected, res)
6059
}
6160

62-
func TestGetOracleDiskGroups_Error(t *testing.T) {
61+
func TestListOracleDiskGroups_Error(t *testing.T) {
6362
mockCtrl := gomock.NewController(t)
6463
defer mockCtrl.Finish()
6564
db := NewMockMongoDatabaseInterface(mockCtrl)
@@ -69,9 +68,9 @@ func TestGetOracleDiskGroups_Error(t *testing.T) {
6968
}
7069

7170
e := errors.New("connection error")
72-
db.EXPECT().GetOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME}).Return(nil, e)
71+
db.EXPECT().ListOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME}).Return(nil, e)
7372

74-
res, err := as.GetOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME})
73+
res, err := as.ListOracleDiskGroups(dto.GlobalFilter{OlderThan: utils.MAX_TIME})
7574
require.ErrorIs(t, err, e)
7675
assert.Nil(t, res)
7776
}

api-service/service/service.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ type APIServiceInterface interface {
176176
CreateOracleDatabasePartitioningsXlsx(filter dto.GlobalFilter) (*excelize.File, error)
177177

178178
// ORACLE DATABASE DISK GROUPS
179-
GetOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error)
179+
GetOracleDiskGroups(hostname, dbname string) ([]dto.OracleDatabaseDiskGroupDto, error)
180+
ListOracleDiskGroups(filter dto.GlobalFilter) ([]dto.OracleDatabaseDiskGroupDto, error)
180181
CreateOracleDiskGroupsXLSX(filter dto.GlobalFilter) (*excelize.File, error)
181182

182183
// ORACLE DATABASE PLUGGABLE DBS

fixture/test_dataservice_mongohostdata_05.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,6 @@
6262
"totalSpace": {
6363
"$numberDouble": "200.0"
6464
},
65-
"usedSpace": {
66-
"$numberDouble": "50.0"
67-
},
6865
"freeSpace": {
6966
"$numberDouble": "150.0"
7067
}

model/oracle_database_disk_group.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,5 @@ package model
1919
type OracleDatabaseDiskGroup struct {
2020
DiskGroupName string `json:"diskGroupName" bson:"diskGroupName"`
2121
TotalSpace float64 `json:"totalSpace" bson:"totalSpace"`
22-
UsedSpace float64 `json:"usedSpace" bson:"usedSpace"`
2322
FreeSpace float64 `json:"freeSpace" bson:"freeSpace"`
2423
}

0 commit comments

Comments
 (0)