Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ dependencies {
implementation("org.springframework.security:spring-security-data")
implementation("org.springframework.security:spring-security-messaging")
implementation("org.springframework.security:spring-security-web")
implementation("org.testcontainers:postgresql:1.18.3")
implementation("org.testcontainers:postgresql")
implementation(files("$projectDir/src/main/resources/third-party/j2ts-api.jar"))
implementation(group = "com.fasterxml.jackson.dataformat", name = "jackson-dataformat-yaml", version = "2.13.1")
implementation(group = "com.github.luben", name = "zstd-jni", version = "1.5.2-3")
Expand Down
12 changes: 6 additions & 6 deletions backend/src/main/java/ai/giskard/GiskardApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import ai.giskard.config.ApplicationProperties;
import ai.giskard.config.GiskardConstants;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -13,7 +15,6 @@
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import jakarta.annotation.PostConstruct;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
Expand All @@ -24,16 +25,13 @@
@SpringBootApplication
@EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class})
@EnableJpaAuditing
@RequiredArgsConstructor
public class GiskardApp {

private static final Logger log = LoggerFactory.getLogger(GiskardApp.class);

private final Environment env;

public GiskardApp(Environment env) {
this.env = env;
}

/**
* Initializes giskard.
* <p>
Expand Down Expand Up @@ -99,13 +97,15 @@ private static void logApplicationStartup(Environment env) {
\tMax: %s MB
\tFree: %s MB""", totalMemory, maxMemory, freeMemory);
String swaggerURL = hasApiDocsProfile ? String.format("Swagger UI: %s://localhost:%s%sswagger-ui/index.html\t%n\t", protocol, serverPort, contextPath) : "";

log.info(
"\n----------------------------------------------------------\n\t" +
memoryStatusLine +
"\n----------------------------------------------------------\n\t" +
"Application '{}' is running! Access URLs:\n\t" +
"Application '{}' is running!\n\t" +
"Local: \t\t{}://localhost:{}{}\n\t" +
"External: \t{}://{}:{}{}\n\t" +
"DB URL: \t"+env.getProperty("spring.datasource.url")+"\n\t" +
swaggerURL +
"Giskard Home: " + giskardHome + "\n\t" +
"Profile(s): \t{}\n----------------------------------------------------------",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package ai.giskard.config;

import ai.giskard.service.GiskardRuntimeException;
import liquibase.integration.spring.SpringLiquibase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.liquibase.DataSourceClosingSpringLiquibase;
Expand All @@ -12,11 +15,13 @@
import org.springframework.core.env.Environment;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Optional;
import java.util.function.Supplier;

@Configuration
public class LiquibaseConfiguration {
private static final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class);

private final Environment env;

Expand Down Expand Up @@ -59,6 +64,11 @@ public SpringLiquibase liquibase(
if (ds != null) {
liquibase = new SpringLiquibase();
liquibase.setDataSource(ds);
try (var conn = ds.getConnection()) {
log.info("Liquibase connection: {}", conn.getMetaData().getURL());
} catch (SQLException e) {
throw new GiskardRuntimeException("Failed to get connection from liquibase datasource");
}
} else {
liquibase = new DataSourceClosingSpringLiquibase();
liquibase.setDataSource(createNewDataSource(liquibaseProperties, dataSourceProperties));
Expand All @@ -72,7 +82,7 @@ public SpringLiquibase liquibase(
liquibase.setDatabaseChangeLogLockTable(liquibaseProperties.getDatabaseChangeLogLockTable());
liquibase.setDatabaseChangeLogTable(liquibaseProperties.getDatabaseChangeLogTable());
liquibase.setDropFirst(liquibaseProperties.isDropFirst());
liquibase.setLabels(liquibaseProperties.getLabels());
liquibase.setLabelFilter(liquibaseProperties.getLabelFilter());
liquibase.setChangeLogParameters(liquibaseProperties.getParameters());
liquibase.setRollbackFile(liquibaseProperties.getRollbackFile());
liquibase.setTestRollbackOnUpdate(liquibaseProperties.isTestRollbackOnUpdate());
Expand Down
55 changes: 27 additions & 28 deletions backend/src/main/java/ai/giskard/config/SecurityConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
Expand Down Expand Up @@ -47,41 +46,41 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)
).sessionManagement(conf -> conf.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(antMatcher("/api/v2/dev/**")).permitAll()
.requestMatchers(antMatcher("/api/v2/settings/license")).permitAll()
.requestMatchers(
antMatcher(WEBSOCKET_ENDPOINT),
antMatcher(MLWORKER_WEBSOCKET_ENDPOINT),
antMatcher(HttpMethod.OPTIONS, "/**"),
antMatcher("/swagger-ui/**"),
antMatcher("/v3/api-docs/**"),
antMatcher("/test/**"),
antMatcher("/api/v2/dev/**"),
antMatcher("/api/v2/settings/license"),
antMatcher("/api/v2/settings"),
antMatcher("/api/v2/setup"),
antMatcher("/api/v2/ee/license"),
antMatcher("/api/v2/authenticate"),
antMatcher("/api/v2/register"),
antMatcher("/api/v2/register"),
antMatcher("/api/v2/activate"),
antMatcher("/api/v2/account/password-recovery"),
antMatcher("/api/v2/account/reset-password"),
antMatcher("/management/health"),
antMatcher("/management/health/**"),
antMatcher("/management/info"),
antMatcher("/management/prometheus")
).permitAll()
.requestMatchers(
antMatcher("/api/admin/**"),
antMatcher("/management/**")
).hasAuthority(AuthoritiesConstants.ADMIN)
.requestMatchers(antMatcher("/api/v2/settings/ml-worker-connect")).hasAuthority(AuthoritiesConstants.API)
.requestMatchers(antMatcher("/api/v2/settings")).permitAll()
.requestMatchers(antMatcher("/api/v2/setup")).permitAll()
.requestMatchers(antMatcher("/api/v2/ee/license")).permitAll()
.requestMatchers(antMatcher("/api/v2/authenticate")).permitAll()
.requestMatchers(antMatcher("/api/v2/register")).permitAll()
.requestMatchers(antMatcher("/api/v2/register")).permitAll()
.requestMatchers(antMatcher("/api/v2/activate")).permitAll()
.requestMatchers(antMatcher("/api/v2/account/password-recovery")).permitAll()
.requestMatchers(antMatcher("/api/v2/account/reset-password")).permitAll()
.requestMatchers(antMatcher("/api/admin/**")).hasAuthority(AuthoritiesConstants.ADMIN)
.requestMatchers(antMatcher("/api/**")).authenticated()
.requestMatchers(antMatcher("/management/health")).permitAll()
.requestMatchers(antMatcher("/management/health/**")).permitAll()
.requestMatchers(antMatcher("/management/info")).permitAll()
.requestMatchers(antMatcher("/management/prometheus")).permitAll()
.requestMatchers(antMatcher("/management/**")).hasAuthority(AuthoritiesConstants.ADMIN)
)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.apply(securityConfigurerAdapter());
return http.build();
}

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring()
.requestMatchers(antMatcher(WEBSOCKET_ENDPOINT))
.requestMatchers(antMatcher(MLWORKER_WEBSOCKET_ENDPOINT))
.requestMatchers(antMatcher(HttpMethod.OPTIONS, "/**"))
.requestMatchers(antMatcher("/swagger-ui/**"))
.requestMatchers(antMatcher("/v3/api-docs/**"))
.requestMatchers(antMatcher("/test/**"));
}

@Bean
public PasswordEncoder passwordEncoder() {
Expand Down
5 changes: 3 additions & 2 deletions backend/src/main/java/ai/giskard/domain/BaseEntity.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package ai.giskard.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;

import jakarta.persistence.*;
import java.io.Serializable;

@Getter
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the base inheritance strategy without this line?

public abstract class BaseEntity implements Serializable {
@Id
@JsonIgnore
Expand Down
6 changes: 3 additions & 3 deletions backend/src/main/java/ai/giskard/domain/ml/FunctionInput.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package ai.giskard.domain.ml;

import ai.giskard.ml.dto.MLWorkerWSGeneratedTestInputDTO;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -27,7 +27,7 @@ public class FunctionInput implements Serializable {

private String type;

@Column(columnDefinition = "CLOB", name = "input_value")
@Column(columnDefinition = "text", name = "input_value")
@Lob
private String value;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ private static HttpStatus getHttpStatus(Throwable ex) {
if (ex instanceof ConcurrencyFailureException) return HttpStatus.CONFLICT;
if (ex instanceof BadCredentialsException) return HttpStatus.UNAUTHORIZED;
if (ex instanceof AccessDeniedException) return HttpStatus.FORBIDDEN;
if (ex instanceof IllegalArgumentException) return HttpStatus.BAD_REQUEST;
return HttpStatus.INTERNAL_SERVER_ERROR;
}
}
2 changes: 1 addition & 1 deletion backend/src/main/resources/config/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ logging:
ROOT: INFO
org.hibernate.SQL: INFO
ai.giskard: INFO
com.zaxxer.hikari.HikariConfig: DEBUG
com.zaxxer.hikari.HikariConfig: INFO
com.zaxxer.hikari: INFO

spring:
Expand Down
2 changes: 1 addition & 1 deletion backend/src/main/resources/config/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ logging:
level:
ROOT: INFO
ai.giskard: INFO
com.zaxxer.hikari.HikariConfig: DEBUG
com.zaxxer.hikari.HikariConfig: INFO

management:
metrics:
Expand Down
2 changes: 0 additions & 2 deletions backend/src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
<logger name="com.ryantenney" level="WARN"/>
<logger name="com.sun" level="WARN"/>
<logger name="com.zaxxer" level="WARN"/>
<logger name="io.undertow" level="WARN"/>
<logger name="io.undertow.websockets.jsr" level="ERROR"/>
<logger name="org.apache" level="WARN"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
<logger name="org.bson" level="WARN"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:postgresql:12:///giskard?TC_TMPFS=/testtmpfs:rw
url: jdbc:tc:postgresql:13:///giskard?TC_TMPFS=/testtmpfs:rw
username: giskard
password:
hikari:
Expand Down
7 changes: 0 additions & 7 deletions backend/src/test/resources/logback.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
<logger name="com.zaxxer" level="WARN"/>
<logger name="com.github.dockerjava" level="WARN"/>
<logger name="org.testcontainers" level="INFO"/>
<logger name="io.undertow" level="WARN"/>
<logger name="io.undertow.websockets.jsr" level="ERROR"/>
<logger name="org.apache" level="WARN"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
<logger name="org.bson" level="WARN"/>
Expand All @@ -37,9 +35,4 @@
<logger name="LiquibaseSchemaResolver" level="INFO"/>
<logger name="sun.rmi.transport" level="WARN"/>
<logger name="com.tngtech.archunit.core.importer" level="ERROR"/>

<root level="warn">
<appender-ref ref="CONSOLE"/>
</root>

</configuration>