Skip to content

Commit

Permalink
Merge branch 'main' into feature/validation
Browse files Browse the repository at this point in the history
# Conflicts:
#	backend/src/main/java/ca/bc/gov/nrs/vdyp/backend/projection/StubProjectionRunner.java
#	backend/src/test/java/ca/bc/gov/nrs/vdyp/backend/endpoints/v1/StubHcsvProjectionEndpointTest.java
  • Loading branch information
mjunkin committed Dec 9, 2024
2 parents 0359e1b + c5280a8 commit 4af2e1e
Show file tree
Hide file tree
Showing 70 changed files with 2,346 additions and 3,649 deletions.
1 change: 1 addition & 0 deletions .github/workflows/.deployer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ jobs:
--set frontend.env.VITE_SSO_CLIENT_ID=${{ secrets.VITE_SSO_CLIENT_ID }} \
--set frontend.env.VITE_SSO_REALM=${{ secrets.VITE_SSO_REALM }} \
--set frontend.env.VITE_SSO_REDIRECT_URI=${{ secrets.VITE_SSO_REDIRECT_URI }} \
--set frontend.env.VITE_API_URL=${{ secrets.VITE_API_URL }} \
${{ inputs.params }} \
--install --wait --atomic ${{ steps.vars.outputs.release }} \
--timeout ${{ inputs.timeout-minutes }}m \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,18 @@

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.MessageFormat;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;

public class NullMessageLog implements IMessageLog {

private static final Logger logger = LoggerFactory.getLogger(NullMessageLog.class);

private final Level loggerLevel;

public NullMessageLog(Level loggerLevel) {
this.loggerLevel = loggerLevel;
/* do nothing */
}

@Override
public void addMessage(String message, Object... arguments) {
if (arguments.length > 0) {
message = MessageFormat.format(message, arguments);
}
logger.atLevel(loggerLevel).log(loggerLevel + " message: " + message);
/* do nothing */
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package ca.bc.gov.nrs.vdyp.backend.projection;

import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Map;

import ca.bc.gov.nrs.vdyp.backend.api.v1.exceptions.ProjectionExecutionException;
import ca.bc.gov.nrs.vdyp.backend.api.v1.exceptions.ProjectionRequestValidationException;
import ca.bc.gov.nrs.vdyp.backend.model.v1.Parameters;
import ca.bc.gov.nrs.vdyp.backend.model.v1.ProjectionRequestKind;
import ca.bc.gov.nrs.vdyp.backend.projection.input.AbstractPolygonStream;
import ca.bc.gov.nrs.vdyp.backend.utils.FileHelper;
import ca.bc.gov.nrs.vdyp.backend.v1.api.impl.exceptions.ProjectionExecutionException;
import ca.bc.gov.nrs.vdyp.backend.v1.api.impl.exceptions.ProjectionRequestValidationException;
import ca.bc.gov.nrs.vdyp.backend.v1.gen.model.Parameters;
import ca.bc.gov.nrs.vdyp.backend.v1.gen.model.ProjectionRequestKind;
import jakarta.validation.Valid;

public class StubProjectionRunner implements IProjectionRunner {

Expand Down Expand Up @@ -39,28 +38,17 @@ public ProjectionState getState() {

@Override
public InputStream getYieldTable() throws ProjectionExecutionException {
try {
return FileHelper.getStubResourceFile("Output_YldTbl.csv");
} catch (IOException e) {
throw new ProjectionExecutionException(e);
}
// No projection was done; therefore, there's no yield table.
return new ByteArrayInputStream(new byte[0]);
}

@Override
public InputStream getProgressStream() throws ProjectionExecutionException {
try {
return FileHelper.getStubResourceFile("Output_Log.txt");
} catch (IOException e) {
throw new ProjectionExecutionException(e);
}
public InputStream getProgressStream() {
return state.getProgressLog().getAsStream();
}

@Override
public InputStream getErrorStream() throws ProjectionExecutionException {
try {
return FileHelper.getStubResourceFile("Output_Error.txt");
} catch (IOException e) {
throw new ProjectionExecutionException(e);
}
public InputStream getErrorStream() {
return state.getErrorLog().getAsStream();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package ca.bc.gov.nrs.api.v1.endpoints;

import static io.restassured.RestAssured.given;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.hamcrest.Matchers;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import ca.bc.gov.nrs.api.helpers.TestHelper;
import ca.bc.gov.nrs.vdyp.backend.v1.gen.api.ParameterNames;
import ca.bc.gov.nrs.vdyp.backend.v1.gen.model.Parameters;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.MediaType;

@QuarkusTest
class StubHcsvProjectionEndpointTest {

private final TestHelper testHelper;

@Inject
StubHcsvProjectionEndpointTest(TestHelper testHelper) {
this.testHelper = testHelper;
}

@BeforeEach
void setup() {
}

@Test
void testProjectionHscv_shouldReturnStatusOK() throws IOException {

Path resourceFolderPath = Path.of("VDYP7Console-sample-files", "hcsv", "vdyp-240");

Parameters parameters = testHelper.addSelectedOptions(
new Parameters(), //
Parameters.SelectedExecutionOptionsEnum.DO_ENABLE_DEBUG_LOGGING,
Parameters.SelectedExecutionOptionsEnum.DO_ENABLE_PROGRESS_LOGGING,
Parameters.SelectedExecutionOptionsEnum.DO_ENABLE_ERROR_LOGGING
);

// Included to generate JSON text of parameters as needed
// ObjectMapper mapper = new ObjectMapper();
// String serializedParametersText = mapper.writeValueAsString(parameters);

InputStream zipInputStream = given().basePath(TestHelper.ROOT_PATH).when() //
.multiPart(ParameterNames.PROJECTION_PARAMETERS, parameters, MediaType.APPLICATION_JSON) //
.multiPart(
ParameterNames.POLYGON_INPUT_DATA,
Files.readAllBytes(testHelper.getResourceFile(resourceFolderPath, "VDYP7_INPUT_POLY.csv"))
) //
.multiPart(
ParameterNames.LAYERS_INPUT_DATA,
Files.readAllBytes(testHelper.getResourceFile(resourceFolderPath, "VDYP7_INPUT_LAYER.csv"))
) //
.post("/projection/hcsv?trialRun=true") //
.then().statusCode(201) //
.and().contentType("application/octet-stream") //
.and().header("content-disposition", Matchers.startsWith("attachment;filename=\"vdyp-output-")) //
.extract().body().asInputStream();

ZipInputStream zipFile = new ZipInputStream(zipInputStream);
ZipEntry entry1 = zipFile.getNextEntry();
assertEquals("YieldTable.csv", entry1.getName());
String entry1Content = new String(testHelper.readZipEntry(zipFile, entry1));
assertTrue(entry1Content.length() == 0);

ZipEntry entry2 = zipFile.getNextEntry();
assertEquals("ProgressLog.txt", entry2.getName());
String entry2Content = new String(testHelper.readZipEntry(zipFile, entry2));
assertTrue(entry2Content.startsWith("Running Projection"));

ZipEntry entry3 = zipFile.getNextEntry();
assertEquals("ErrorLog.txt", entry3.getName());
String entry3Content = new String(testHelper.readZipEntry(zipFile, entry3));
assertTrue(entry3Content.isBlank());

ZipEntry entry4 = zipFile.getNextEntry();
assertEquals("DebugLog.txt", entry4.getName());
String entry4Content = new String(testHelper.readZipEntry(zipFile, entry4));
assertTrue(entry4Content.startsWith(LocalDate.now().format(DateTimeFormatter.ISO_DATE)));
}

@Test
void testProjectionHscv_testNoProgressLogging() throws IOException {

Path resourceFolderPath = Path.of("VDYP7Console-sample-files", "hcsv", "vdyp-240");

Parameters parameters = new Parameters();

InputStream zipInputStream = given().basePath(TestHelper.ROOT_PATH).when() //
.multiPart(ParameterNames.PROJECTION_PARAMETERS, parameters, MediaType.APPLICATION_JSON) //
.multiPart(
ParameterNames.POLYGON_INPUT_DATA,
Files.readAllBytes(testHelper.getResourceFile(resourceFolderPath, "VDYP7_INPUT_POLY.csv"))
) //
.multiPart(
ParameterNames.LAYERS_INPUT_DATA,
Files.readAllBytes(testHelper.getResourceFile(resourceFolderPath, "VDYP7_INPUT_LAYER.csv"))
) //
.post("/projection/hcsv?trialRun=true") //
.then().statusCode(201) //
.and().contentType("application/octet-stream") //
.and().header("content-disposition", Matchers.startsWith("attachment;filename=\"vdyp-output-")) //
.extract().body().asInputStream();

ZipInputStream zipFile = new ZipInputStream(zipInputStream);
ZipEntry entry1 = zipFile.getNextEntry();
assertEquals("YieldTable.csv", entry1.getName());
String entry1Content = new String(testHelper.readZipEntry(zipFile, entry1));
assertTrue(entry1Content.length() == 0);

ZipEntry entry2 = zipFile.getNextEntry();
assertEquals("ProgressLog.txt", entry2.getName());
String entry2Content = new String(testHelper.readZipEntry(zipFile, entry2));
assertTrue(entry2Content.isBlank());

ZipEntry entry3 = zipFile.getNextEntry();
assertEquals("ErrorLog.txt", entry3.getName());
String entry3Content = new String(testHelper.readZipEntry(zipFile, entry3));
assertTrue(entry3Content.isBlank());

ZipEntry entry4 = zipFile.getNextEntry();
assertEquals("DebugLog.txt", entry4.getName());
String entry4Content = new String(testHelper.readZipEntry(zipFile, entry4));
assertTrue(entry4Content.isBlank());
}
}
4 changes: 3 additions & 1 deletion charts/app/templates/frontend/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ spec:
- name: VITE_SSO_REALM
value: {{ .Values.frontend.env.VITE_SSO_REALM | quote }}
- name: VITE_SSO_REDIRECT_URI
value: {{ .Values.frontend.env.VITE_SSO_REDIRECT_URI | quote }}
value: {{ .Values.frontend.env.VITE_SSO_REDIRECT_URI | quote }}
- name: VITE_API_URL
value: {{ .Values.frontend.env.VITE_API_URL | quote }}
ports:
- name: http
containerPort: 3000
Expand Down
3 changes: 2 additions & 1 deletion charts/app/values-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,12 @@ frontend:
pdb:
enabled: false # enable it in PRODUCTION for having pod disruption budget.
minAvailable: 1 # the minimum number of pods that must be available during the disruption budget.
env:
env:
VITE_SSO_AUTH_SERVER_URL: ~
VITE_SSO_CLIENT_ID: ~
VITE_SSO_REALM: ~
VITE_SSO_REDIRECT_URI: ~
VITE_API_URL: ~

crunchy: # enable it for TEST and PROD, for PR based pipelines simply use single postgres
enabled: false
Expand Down
14 changes: 8 additions & 6 deletions frontend/Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
header {
Content-Type text/javascript
}
respond `window.config={"VITE_SSO_AUTH_SERVER_URL":"{$VITE_SSO_AUTH_SERVER_URL}", "VITE_SSO_CLIENT_ID":"{$VITE_SSO_CLIENT_ID}", "VITE_SSO_REALM":"{$VITE_SSO_REALM}", "VITE_SSO_REDIRECT_URI":"{$VITE_SSO_REDIRECT_URI}"};`
respond `window.config={"VITE_SSO_AUTH_SERVER_URL":"{$VITE_SSO_AUTH_SERVER_URL}", "VITE_SSO_CLIENT_ID":"{$VITE_SSO_CLIENT_ID}", "VITE_SSO_REALM":"{$VITE_SSO_REALM}", "VITE_SSO_REDIRECT_URI":"{$VITE_SSO_REDIRECT_URI}", "VITE_API_URL":"{$VITE_API_URL}"};`
}
root * /srv
encode zstd gzip
Expand All @@ -31,18 +31,20 @@
}
rewrite @spa_router {http.matchers.file.relative}
# Proxy requests to API service
reverse_proxy /api/* {$BACKEND_URL} {
header_up Host {http.reverse_proxy.upstream.hostport}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
handle_path /api/* {
reverse_proxy {$VITE_API_URL} {
header_up Host {http.reverse_proxy.upstream.hostport}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
}
}
header {
X-Frame-Options "SAMEORIGIN"
X-XSS-Protection "1;mode=block"
Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate"
X-Content-Type-Options "nosniff"
Strict-Transport-Security "max-age=31536000"
Content-Security-Policy "default-src 'self' https://spt.apps.gov.bc.ca data:; script-src 'self' 'unsafe-eval' https://www2.gov.bc.ca; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://use.fontawesome.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https://fonts.googleapis.com http://www.w3.org https://*.gov.bc.ca; frame-src 'self' https://dev.loginproxy.gov.bc.ca https://login.microsoftonline.com; connect-src 'self' https://dev.loginproxy.gov.bc.ca"
Content-Security-Policy "default-src 'self' https://spt.apps.gov.bc.ca data:; script-src 'self' 'unsafe-eval' https://www2.gov.bc.ca; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://use.fontawesome.com https://cdn.jsdelivr.net; font-src 'self' https://fonts.gstatic.com https://cdn.jsdelivr.net; img-src 'self' data: https://fonts.googleapis.com http://www.w3.org https://*.gov.bc.ca; frame-src 'self' https://*.gov.bc.ca https://login.microsoftonline.com; connect-src 'self' https://*.gov.bc.ca"
Referrer-Policy "same-origin"
Feature-Policy "fullscreen 'self'; camera 'none'; microphone 'none'"
}
Expand Down
Loading

0 comments on commit 4af2e1e

Please sign in to comment.