Skip to content

Commit

Permalink
Merge pull request #3381 from ingef/feature/version-propagation-rework
Browse files Browse the repository at this point in the history
Rework version info format
  • Loading branch information
Kadrian authored May 14, 2024
2 parents 37f6b1c + 0443e62 commit cbdf7bb
Show file tree
Hide file tree
Showing 14 changed files with 150 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,22 @@

import java.net.URL;
import java.time.LocalDate;
import java.util.Map;
import java.util.List;

import com.bakdata.conquery.models.config.FrontendConfig;
import com.bakdata.conquery.models.config.IdColumnConfig;

/**
* API Response for the dynamic configuration of the frontend
*
* @param version backend version
* @param formBackendVersions mapping of form backend ids to their versions (version can be null)
* @param versions mapping of backend and form backend ids to their versions (version can be null)
* @param currency currency representation
* @param queryUpload identifier specific column configuration for the query upload
* @param manualUrl url to a user manual
* @param contactEmail typical a mailto-url
*/
public record FrontendConfiguration(
String version,

Map<String, String> formBackendVersions,
List<VersionContainer> versions,
FrontendConfig.CurrencyConfig currency,
IdColumnConfig queryUpload,
URL manualUrl,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.bakdata.conquery.apiv1.frontend;

import java.time.ZonedDateTime;

import lombok.NonNull;

public record VersionContainer(
@NonNull String name,
String version,
ZonedDateTime buildTime
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,6 @@
import java.util.UUID;
import java.util.function.Function;

import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.client.Invocation;
import jakarta.ws.rs.client.WebTarget;
import jakarta.ws.rs.core.GenericType;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

import com.bakdata.conquery.apiv1.forms.ExternalForm;
import com.bakdata.conquery.models.auth.entities.User;
import com.bakdata.conquery.models.auth.permissions.Ability;
Expand All @@ -24,6 +16,13 @@
import com.codahale.metrics.health.HealthCheck;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.dropwizard.health.check.http.HttpHealthCheck;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.client.Invocation;
import jakarta.ws.rs.client.WebTarget;
import jakarta.ws.rs.core.GenericType;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;

@Slf4j
Expand Down Expand Up @@ -129,8 +128,8 @@ public HealthCheck createHealthCheck() {
return new HttpHealthCheck(getHealthTarget.getUri().toString(), client);
}

public String getVersion() {
return getVersionTarget.request(MediaType.APPLICATION_JSON_TYPE).get(FormBackendVersion.class).getVersion();
public FormBackendVersion getVersion() {
return getVersionTarget.request(MediaType.APPLICATION_JSON_TYPE).get(FormBackendVersion.class);
}

public ExternalTaskState cancelTask(UUID taskId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.bakdata.conquery.io.external.form;

import lombok.Data;
import java.time.ZonedDateTime;

@Data
public class FormBackendVersion {
private String version;

public record FormBackendVersion(
String version,
ZonedDateTime buildTime
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,14 @@
import java.util.HashSet;
import java.util.Set;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.ws.rs.client.Client;

import com.bakdata.conquery.apiv1.forms.ExternalForm;
import com.bakdata.conquery.apiv1.frontend.VersionContainer;
import com.bakdata.conquery.commands.ManagerNode;
import com.bakdata.conquery.io.cps.CPSType;
import com.bakdata.conquery.io.cps.CPSTypeIdResolver;
import com.bakdata.conquery.io.external.form.ExternalFormBackendApi;
import com.bakdata.conquery.io.external.form.ExternalFormMixin;
import com.bakdata.conquery.io.external.form.FormBackendVersion;
import com.bakdata.conquery.models.auth.entities.User;
import com.bakdata.conquery.models.auth.permissions.Ability;
import com.bakdata.conquery.models.config.auth.AuthenticationClientFilterProvider;
Expand All @@ -33,6 +29,11 @@
import com.google.common.collect.ImmutableCollection;
import io.dropwizard.client.JerseyClientBuilder;
import io.dropwizard.jersey.jackson.JacksonMessageBodyProvider;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.ws.rs.client.Client;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

Expand Down Expand Up @@ -112,18 +113,20 @@ public void initialize(ManagerNode managerNode) {
private void updateVersion(ExternalFormBackendApi externalApi) {

try {
final String version = externalApi.getVersion();
final String oldVersion = VersionInfo.INSTANCE.setFormBackendVersion(getId(), version);
if (!version.equals(oldVersion)) {
log.info("Form Backend '{}' version update: {} -> {}", getId(), oldVersion, version);
final FormBackendVersion versionInfo = externalApi.getVersion();
final VersionContainer
oldVersion =
VersionInfo.INSTANCE.setFormBackendVersion(new VersionContainer(getId(), versionInfo.version(), versionInfo.buildTime()));
if (!versionInfo.equals(oldVersion)) {
log.info("Form Backend '{}' versionInfo update: {} -> {}", getId(), oldVersion, versionInfo);
}
}
catch (Exception e) {
log.warn("Unable to retrieve version from form backend '{}'. Enable trace logging for more info", getId(), (Exception) (log.isTraceEnabled()
? e
: null));
// Set place holder
VersionInfo.INSTANCE.setFormBackendVersion(getId(), "no-version-available");

VersionInfo.INSTANCE.setFormBackendVersion(new VersionContainer(getId(), null, null));
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ public FrontendConfiguration getFrontendConfig() {
.toList());

final FrontendConfig frontendConfig = config.getFrontend();


return new FrontendConfiguration(
VersionInfo.INSTANCE.getProjectVersion(),
VersionInfo.INSTANCE.getFormBackendVersions(),
VersionInfo.INSTANCE.getVersions(),
frontendConfig.getCurrency(),
idColumns,
frontendConfig.getManualUrl(),
Expand Down
26 changes: 21 additions & 5 deletions backend/src/main/java/com/bakdata/conquery/util/VersionInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import java.io.BufferedReader;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

import com.bakdata.conquery.apiv1.frontend.VersionContainer;
import com.github.powerlibraries.io.In;
import lombok.Getter;
import lombok.ToString;
Expand All @@ -21,8 +24,12 @@ public class VersionInfo {
private ZonedDateTime buildTime;
private String projectVersion;

// Form backend id -> version
private final Map<String, String> formBackendVersions = new HashMap<>();
/**
* Form backend id -> version
*
* @implNote using {@link TreeMap} to have a stable key order
*/
private final Map<String, VersionContainer> formBackendVersions = new TreeMap<>();

private VersionInfo() {
try {
Expand All @@ -45,7 +52,16 @@ private VersionInfo() {
}
}

public String setFormBackendVersion(String formBackendId, String version) {
return formBackendVersions.put(formBackendId, version);
public List<VersionContainer> getVersions() {
List<VersionContainer> versions = new ArrayList<>();

versions.add(new VersionContainer("Backend", projectVersion, null));
versions.addAll(formBackendVersions.values());

return versions;
}

public VersionContainer setFormBackendVersion(VersionContainer version) {
return formBackendVersions.put(version.name(), version);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
openapi: 3.0.0
info:
title: Form Backend
version: 1.0.1
version: 1.0.2
description: |
API for generic external form backends in [Conquery](https://github.com/ingef/conquery).
Expand Down Expand Up @@ -321,6 +321,10 @@ components:
version:
type: string
example: "3.2.1-ge966c285"
buildTime:
type: string
format: date-time
example: "2007-08-31T16:47:00+00:00"
securitySchemes:
ApiKeyAuth:
type: apiKey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,14 @@
import java.io.File;
import java.net.URI;
import java.nio.file.Path;
import java.time.ZonedDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriBuilder;

import com.bakdata.conquery.apiv1.execution.FullExecutionStatus;
import com.bakdata.conquery.apiv1.execution.ResultAsset;
import com.bakdata.conquery.apiv1.frontend.FrontendConfiguration;
import com.bakdata.conquery.apiv1.frontend.VersionContainer;
import com.bakdata.conquery.integration.common.IntegrationUtils;
import com.bakdata.conquery.io.result.ExternalResult;
import com.bakdata.conquery.models.auth.entities.User;
Expand All @@ -34,6 +32,8 @@
import com.bakdata.conquery.resources.hierarchies.HierarchyHelper;
import com.bakdata.conquery.util.support.StandaloneSupport;
import com.bakdata.conquery.util.support.TestConquery;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriBuilder;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -79,9 +79,9 @@ public void execute(String name, TestConquery testConquery) throws Exception {
frontendConfiguration =
support.getClient().target(frontendConfigURI).request(MediaType.APPLICATION_JSON_TYPE).get().readEntity(FrontendConfiguration.class);

assertThat(frontendConfiguration.formBackendVersions())
assertThat(frontendConfiguration.versions())
.describedAs("Checking health of form backend")
.containsExactlyEntriesOf(Map.of(FORM_BACKEND_ID, "3.2.1-ge966c285")); // example value from OpenAPI Spec
.contains(new VersionContainer(FORM_BACKEND_ID, "3.2.1-ge966c285", ZonedDateTime.parse("2007-08-31T16:47:00+00:00"))); // example value from OpenAPI Spec

log.info("Send an external form");
final User testUser = support.getTestUser();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import java.io.IOException;
import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
Expand All @@ -29,6 +30,7 @@
import com.bakdata.conquery.apiv1.query.concept.specific.CQOr;
import com.bakdata.conquery.io.AbstractSerializationTest;
import com.bakdata.conquery.io.cps.CPSType;
import com.bakdata.conquery.io.external.form.FormBackendVersion;
import com.bakdata.conquery.io.jackson.Injectable;
import com.bakdata.conquery.io.jackson.MutableInjectableValues;
import com.bakdata.conquery.io.jackson.serializer.SerializationTestUtil;
Expand Down Expand Up @@ -833,4 +835,13 @@ public void arrayObject2Int() throws JSONException, IOException {

}

@Test
public void formBackendVersion() throws JSONException, IOException {
final FormBackendVersion version = new FormBackendVersion("3.45.45-g85ut85u43t8", ZonedDateTime.parse("2007-12-03T10:15:30+00:00"));

SerializationTestUtil.forType(FormBackendVersion.class)
.objectMappers(getApiMapper(), getManagerInternalMapper())
.test(version);
}

}
7 changes: 5 additions & 2 deletions frontend/src/js/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,8 +292,11 @@ export interface QueryUploadConfigT {
}

export interface GetFrontendConfigResponseT {
version: string;
formBackendVersions: Record<string, string>;
versions: {
name: string;
version: string | null; // probably shouldn't be nullable at all
buildTime: string | null; // should be optional, not null
}[];
currency: CurrencyConfigT;
queryUpload: QueryUploadConfigT;
manualUrl?: string;
Expand Down
Loading

0 comments on commit cbdf7bb

Please sign in to comment.