Skip to content

Commit 4d74ced

Browse files
JasperB-TeamBluedupondje
authored andcommitted
core: Extract last made backup from db and expose in API
Fill in information about the last backups made for each scope in the API. Signed-off-by: Jasper Berton <[email protected]> Signed-off-by: Jean-Louis Dupond <[email protected]>
1 parent 6b9619d commit 4d74ced

File tree

8 files changed

+153
-19
lines changed

8 files changed

+153
-19
lines changed

backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EngineBackupAwarenessManager.java

+4-18
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.ovirt.engine.core.common.AuditLogType;
1616
import org.ovirt.engine.core.common.BackendService;
1717
import org.ovirt.engine.core.common.businessentities.EngineBackupLog;
18+
import org.ovirt.engine.core.common.businessentities.EngineBackupScope;
1819
import org.ovirt.engine.core.common.config.Config;
1920
import org.ovirt.engine.core.common.config.ConfigValues;
2021
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
@@ -32,21 +33,6 @@
3233
@Singleton
3334
public class EngineBackupAwarenessManager implements BackendService {
3435

35-
private enum BackupScope {
36-
DB("db"),
37-
FILES("files");
38-
39-
String name;
40-
41-
BackupScope(String name) {
42-
this.name = name;
43-
}
44-
45-
public String getName() {
46-
return name;
47-
}
48-
}
49-
5036
private static final Logger log = LoggerFactory.getLogger(EngineBackupAwarenessManager.class);
5137
private Lock lock = new ReentrantLock();
5238
@Inject
@@ -96,8 +82,8 @@ private void doBackupCheck() {
9682
AuditLogable alert = new AuditLogableImpl();
9783

9884
//try to get last backup record
99-
EngineBackupLog lastDbBackup = getLastBackupByScope(BackupScope.DB);
100-
EngineBackupLog lastFilesBackup = getLastBackupByScope(BackupScope.FILES);
85+
EngineBackupLog lastDbBackup = getLastBackupByScope(EngineBackupScope.DB);
86+
EngineBackupLog lastFilesBackup = getLastBackupByScope(EngineBackupScope.FILES);
10187
if (lastDbBackup == null || lastFilesBackup == null) {
10288
auditLogDirector.log(alert, AuditLogType.ENGINE_NO_FULL_BACKUP);
10389
} else {
@@ -118,7 +104,7 @@ private void doBackupCheck() {
118104

119105
}
120106

121-
private EngineBackupLog getLastBackupByScope(BackupScope scope) {
107+
private EngineBackupLog getLastBackupByScope(EngineBackupScope scope) {
122108
return engineBackupLogDao.getLastSuccessfulEngineBackup(scope.getName());
123109
}
124110
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.ovirt.engine.core.bll.aaa;
2+
3+
import javax.inject.Inject;
4+
5+
import org.ovirt.engine.core.bll.QueriesCommandBase;
6+
import org.ovirt.engine.core.bll.context.EngineContext;
7+
import org.ovirt.engine.core.common.businessentities.EngineBackupLog;
8+
import org.ovirt.engine.core.common.queries.GetLastEngineBackupParameters;
9+
import org.ovirt.engine.core.dao.EngineBackupLogDao;
10+
11+
public class GetLastEngineBackupQuery<P extends GetLastEngineBackupParameters> extends QueriesCommandBase<P> {
12+
13+
@Inject
14+
private EngineBackupLogDao engineBackupLogDao;
15+
16+
public GetLastEngineBackupQuery(P parameters, EngineContext engineContext) {
17+
super(parameters, engineContext);
18+
}
19+
20+
@Override
21+
protected void executeQueryCommand() {
22+
EngineBackupLog log = (EngineBackupLog) engineBackupLogDao.getLastSuccessfulEngineBackup(getParameters().getEngineBackupScope());
23+
getQueryReturnValue().setReturnValue(log);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.ovirt.engine.core.common.businessentities;
2+
3+
public enum EngineBackupScope {
4+
5+
DB("db"),
6+
FILES("files"),
7+
DWH("dwhdb"),
8+
CINDER("cinderlib"),
9+
KEYCLOAK("keycloak"),
10+
GRAFANA("grafanadb");
11+
12+
String name;
13+
14+
EngineBackupScope(String name) {
15+
this.name = name;
16+
}
17+
18+
public String getName() {
19+
return name;
20+
}
21+
22+
public static EngineBackupScope fromString(String name) {
23+
for (EngineBackupScope scope : EngineBackupScope.values()) {
24+
if (scope.getName().equalsIgnoreCase(name)) {
25+
return scope;
26+
}
27+
}
28+
throw new IllegalArgumentException("No enum constant for name " + name);
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.ovirt.engine.core.common.queries;
2+
3+
import org.ovirt.engine.core.common.businessentities.EngineBackupScope;
4+
5+
public class GetLastEngineBackupParameters extends QueryParametersBase {
6+
7+
private EngineBackupScope scope;
8+
9+
public GetLastEngineBackupParameters() {
10+
}
11+
12+
public GetLastEngineBackupParameters(EngineBackupScope scope) {
13+
this.scope = scope;
14+
}
15+
16+
public void setEngineBackupScope(EngineBackupScope scope) {
17+
this.scope = scope;
18+
}
19+
20+
public String getEngineBackupScope() {
21+
return scope.getName();
22+
}
23+
}

backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/QueryType.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,10 @@ public enum QueryType implements Serializable {
539539
GetSystemOption(QueryAuthType.User),
540540

541541
// Default type instead of having to null check
542-
Unknown(QueryAuthType.User);
542+
Unknown(QueryAuthType.User),
543+
544+
// Last Engine Backup
545+
GetLastEngineBackup;
543546

544547
/**
545548
* What kind of authorization the query requires. Although this is essentially a <code>boolean</code>, it's

backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendApiResource.java

+41
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.ovirt.engine.api.model.ApiSummaryItem;
2626
import org.ovirt.engine.api.model.BaseResource;
2727
import org.ovirt.engine.api.model.DetailedLink;
28+
import org.ovirt.engine.api.model.EngineBackupInfo;
2829
import org.ovirt.engine.api.model.ProductInfo;
2930
import org.ovirt.engine.api.model.Rsdl;
3031
import org.ovirt.engine.api.model.SpecialObjects;
@@ -95,10 +96,13 @@
9596
import org.ovirt.engine.core.branding.BrandingManager;
9697
import org.ovirt.engine.core.common.action.ActionParametersBase;
9798
import org.ovirt.engine.core.common.action.ActionType;
99+
import org.ovirt.engine.core.common.businessentities.EngineBackupLog;
100+
import org.ovirt.engine.core.common.businessentities.EngineBackupScope;
98101
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
99102
import org.ovirt.engine.core.common.config.ConfigValues;
100103
import org.ovirt.engine.core.common.constants.QueryConstants;
101104
import org.ovirt.engine.core.common.mode.ApplicationMode;
105+
import org.ovirt.engine.core.common.queries.GetLastEngineBackupParameters;
102106
import org.ovirt.engine.core.common.queries.GetSystemStatisticsQueryParameters;
103107
import org.ovirt.engine.core.common.queries.QueryParametersBase;
104108
import org.ovirt.engine.core.common.queries.QueryReturnValue;
@@ -282,13 +286,50 @@ public Response get() {
282286
//(https://bugzilla.redhat.com/1612124)
283287
if (!isFiltered()) {
284288
addSummary(api);
289+
// Backup info also admin-only
290+
EngineBackupInfo lastEngineBackupInfo = getLastEngineBackup();
291+
api.setEngineBackup(lastEngineBackupInfo);
285292
}
286293
}
287294
setAuthenticatedUser(api);
288295
return getResponseBuilder(api).entity(api).build();
289296
}
290297
}
291298

299+
private EngineBackupInfo getLastEngineBackup() {
300+
EngineBackupInfo backupInfo = new EngineBackupInfo();
301+
for (EngineBackupScope backupScope : EngineBackupScope.values()) {
302+
QueryReturnValue lastBackupQuery = runQuery(QueryType.GetLastEngineBackup,
303+
new GetLastEngineBackupParameters(backupScope));
304+
EngineBackupLog backupLog = lastBackupQuery.getReturnValue();
305+
if (backupLog != null) {
306+
switch (backupScope) {
307+
case DB:
308+
backupInfo.setLastDbBackup(DateMapper.map(backupLog.getDoneAt(), null));
309+
break;
310+
case DWH:
311+
backupInfo.setLastDwhBackup(DateMapper.map(backupLog.getDoneAt(), null));
312+
break;
313+
case CINDER:
314+
backupInfo.setLastCinderBackup(DateMapper.map(backupLog.getDoneAt(), null));
315+
break;
316+
case KEYCLOAK:
317+
backupInfo.setLastKeycloakBackup(DateMapper.map(backupLog.getDoneAt(), null));
318+
break;
319+
case GRAFANA:
320+
backupInfo.setLastGrafanaBackup(DateMapper.map(backupLog.getDoneAt(), null));
321+
break;
322+
case FILES:
323+
backupInfo.setLastEngineBackup(DateMapper.map(backupLog.getDoneAt(), null));
324+
break;
325+
default:
326+
break;
327+
}
328+
}
329+
}
330+
return backupInfo;
331+
}
332+
292333
/**
293334
* Set a link to the user of the current session
294335
* (the 'authenticated user') in the API object.

backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java

+23
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertNotNull;
55
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
import static org.mockito.ArgumentMatchers.argThat;
67
import static org.mockito.Mockito.eq;
78
import static org.mockito.Mockito.mock;
89
import static org.mockito.Mockito.when;
910
import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqParams;
1011

1112
import java.util.ArrayList;
13+
import java.util.Date;
1214
import java.util.HashMap;
1315
import java.util.List;
1416
import java.util.Locale;
@@ -22,18 +24,22 @@
2224
import org.junit.jupiter.api.AfterEach;
2325
import org.junit.jupiter.api.BeforeEach;
2426
import org.junit.jupiter.api.Test;
27+
import org.mockito.ArgumentMatcher;
2528
import org.ovirt.engine.api.model.Api;
2629
import org.ovirt.engine.api.model.Link;
2730
import org.ovirt.engine.api.model.SpecialObjects;
2831
import org.ovirt.engine.api.restapi.invocation.Current;
2932
import org.ovirt.engine.api.restapi.invocation.CurrentManager;
3033
import org.ovirt.engine.api.restapi.invocation.VersionSource;
3134
import org.ovirt.engine.api.restapi.logging.MessageBundle;
35+
import org.ovirt.engine.core.common.businessentities.EngineBackupLog;
36+
import org.ovirt.engine.core.common.businessentities.EngineBackupScope;
3237
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
3338
import org.ovirt.engine.core.common.config.ConfigValues;
3439
import org.ovirt.engine.core.common.interfaces.BackendLocal;
3540
import org.ovirt.engine.core.common.mode.ApplicationMode;
3641
import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters;
42+
import org.ovirt.engine.core.common.queries.GetLastEngineBackupParameters;
3743
import org.ovirt.engine.core.common.queries.GetSystemStatisticsQueryParameters;
3844
import org.ovirt.engine.core.common.queries.QueryParametersBase;
3945
import org.ovirt.engine.core.common.queries.QueryReturnValue;
@@ -306,6 +312,7 @@ private void setupExpectations(ApplicationMode appMode) {
306312
setUpGetInstanceIdExpectations();
307313
setUpGetUserBySessionExpectations();
308314
setUpGetSystemStatisticsExpectations();
315+
setUpGetLastDbBackendExpectations();
309316
}
310317

311318
protected void doTestGlusterOnlyGet() {
@@ -465,6 +472,22 @@ private QueryParametersBase getProductVersionParams() {
465472
return eqParams(QueryParametersBase.class, new String[0], new Object[0]);
466473
}
467474

475+
protected void setUpGetLastDbBackendExpectations() {
476+
QueryReturnValue queryResult = new QueryReturnValue();
477+
queryResult.setSucceeded(true);
478+
EngineBackupLog emptyReturn = new EngineBackupLog();
479+
emptyReturn.setDoneAt(new Date());
480+
emptyReturn.setScope(EngineBackupScope.DB.getName());
481+
queryResult.setReturnValue(emptyReturn);
482+
when(backend.runQuery(eq(QueryType.GetLastEngineBackup), argThat(new ArgumentMatcher<GetLastEngineBackupParameters>() {
483+
@Override
484+
public boolean matches(GetLastEngineBackupParameters argument) {
485+
return argument != null && argument.getEngineBackupScope() != null; // Match any non-null EngineBackupScope
486+
}
487+
}
488+
))).thenReturn(queryResult);
489+
}
490+
468491
protected void setUpGetSystemStatisticsExpectations() {
469492
QueryReturnValue queryResult = new QueryReturnValue();
470493

frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml

+3
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,9 @@
544544
<!-- Cpu topology -->
545545
<include name="common/businessentities/VdsCpuUnit.java"/>
546546

547+
<!-- For GetLastEngineBackupParameters -->
548+
<include name="common/businessentities/EngineBackupScope.java"/>
549+
547550
</source>
548551

549552
<super-source path="ui/uioverrides" />

0 commit comments

Comments
 (0)