Skip to content

Commit b74819f

Browse files
authored
Merge pull request #12 from USACE/feature/add_standalone
Feature/add standalone
2 parents 6f683cb + ee088ab commit b74819f

File tree

8 files changed

+244
-5
lines changed

8 files changed

+244
-5
lines changed

.github/workflows/build.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Build CWMS RADAR
22
on:
33
push:
44
branches:
5-
- main
5+
- develop
66
pull_request:
77
branches:
88
- develop
@@ -19,4 +19,6 @@ jobs:
1919
java-version: '11'
2020
java-package: jdk
2121
- name: build and test
22-
run: ./gradlew test
22+
run: ./gradlew test
23+
- name: Build docker image
24+
run: ./gradlew dockerBuild

.github/workflows/release.yml

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ name: Create Release
22
on:
33
push:
44
branches:
5-
- main
5+
- develop
66

77
jobs:
88
build:
99
runs-on: ubuntu-latest
1010
steps:
1111
- name: checkout code
1212
uses: actions/checkout@v2
13+
- name: setup java
14+
uses: actions/setup-java@v1
15+
with:
16+
java-version: '11'
17+
java-package: jdk
1318
- name: build
1419
run: ./gradlew build
1520
- name: get version
@@ -46,3 +51,46 @@ jobs:
4651
asset_path: ${{ steps.get_version.outputs.WAR_FILE}}
4752
asset_name: ${{ steps.get_version.outputs.WAR_FILE}}
4853
asset_content_type: application/rpm
54+
publish:
55+
name: API Container Image
56+
# The type of runner that the job will run on
57+
runs-on: ubuntu-latest
58+
59+
# Steps represent a sequence of tasks that will be executed as part of the job
60+
steps:
61+
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
62+
- uses: actions/checkout@v2
63+
- name: setup java
64+
uses: actions/setup-java@v1
65+
with:
66+
java-version: '11'
67+
java-package: jdk
68+
- name: get RADAR version
69+
id: get_version
70+
run: .github/workflows/get_version.sh
71+
- name: Configure AWS credentials
72+
if: ${{ always() }}
73+
uses: aws-actions/configure-aws-credentials@v1
74+
with:
75+
aws-access-key-id: ${{ secrets.CWBICI_DEVELOP_AWS_ACCESS_KEY_ID }}
76+
aws-secret-access-key: ${{ secrets.CWBICI_DEVELOP_AWS_SECRET_ACCESS_KEY }}
77+
aws-region: ${{ secrets.CWBICI_DEVELOP_AWS_REGION }}
78+
- name: Login to Amazon ECR
79+
if: ${{ success() }}
80+
id: login-ecr
81+
uses: aws-actions/amazon-ecr-login@v1
82+
- name: Build, tag, and push image to Amazon ECR (midas-api)
83+
if: ${{ success() }}
84+
env:
85+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
86+
ECR_REPOSITORY: cwms-radar-api
87+
IMAGE_TAG: ${{steps.get_version.outputs.VERSION}}
88+
run: |
89+
./gradlew prepareDocker
90+
cd cwms_radar_standlone/build/docker
91+
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -t $ECR_REGISTRY/$ECR_REPOSITORY:latest .
92+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
93+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
94+
- name: Logout of Amazon ECR
95+
if: ${{ always() }}
96+
run: docker logout ${{ steps.login-ecr.outputs.registry }}

cwms_radar_cwbi/build.gradle

Whitespace-only changes.

cwms_radar_standalone/build.gradle

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
plugins {
2+
id 'application'
3+
}
4+
5+
configurations {
6+
docker
7+
}
8+
9+
dependencies {
10+
implementation 'org.slf4j:slf4j-simple:1.8.0-beta4'
11+
implementation 'org.apache.tomcat:tomcat-jdbc:9.0.41'
12+
implementation 'io.javalin:javalin:3.13.4'
13+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.3'
14+
implementation (project(':cwms_radar_api'))
15+
implementation 'com.oracle.ojdbc:ojdbc8:19.3.0.0'
16+
implementation("io.javalin:javalin:3.12.0")
17+
implementation("io.javalin:javalin-openapi:3.12.0")
18+
implementation 'io.swagger.core.v3:swagger-core:2.0.9'
19+
implementation 'org.webjars:swagger-ui:3.24.3'
20+
implementation 'org.slf4j:slf4j-simple:1.7.28'
21+
implementation "io.dropwizard.metrics:metrics-core:$dropwizard_version"
22+
implementation "io.dropwizard.metrics:metrics-servlets:$dropwizard_version"
23+
}
24+
25+
application {
26+
mainClass = "mil.army.usace.hec.RadarAPI"
27+
}
28+
29+
jar {
30+
manifest {
31+
attributes 'Main-Class': application.mainClass
32+
}
33+
from {
34+
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
35+
}
36+
}
37+
38+
39+
run {
40+
doFirst {
41+
println("$System.env.RADAR_JDBC_USERNAME")
42+
}
43+
debugOptions {
44+
enabled = true
45+
port = 5566
46+
server = true
47+
suspend = false
48+
}
49+
}
50+
51+
task prepareDockerBuild(type:Copy, dependsOn: jar){
52+
doFirst{
53+
project.mkdir( "$buildDir/docker")
54+
}
55+
from "src/docker"
56+
into "$buildDir/docker"
57+
58+
from(configurations.docker)
59+
60+
from( jar.outputs.files.singleFile ){
61+
//include "${project.name}-${project.version}.jar"
62+
into "radar"
63+
rename(".*","radar-standalone.jar")
64+
}
65+
}
66+
67+
task dockerBuild(type: Exec, dependsOn: prepareDockerBuild) {
68+
inputs.files configurations.docker.files
69+
70+
workingDir "$buildDir/docker"
71+
executable "docker"
72+
args "build","--tag=cwms-rest-api:"+project.version, "."
73+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
FROM adoptopenjdk:11-jre-hotspot
2+
RUN groupadd -r radar && useradd -r -s /bin/false -g radar radar
3+
USER radar
4+
COPY radar /radar/
5+
6+
ENV RADAR_JDBC_DRIVER "oracle.jdbc.driver.OracleDriver"
7+
ENV RADAR_JDBC_URL "jdbc:oracle:thin:@localhost/CWMSDEV"
8+
ENV RADAR_JDBC_USERNAME "username here"
9+
ENV RADAR_JDBC_PASSWORD "password here"
10+
ENV RADAR_POOL_INIT_SIZE "5"
11+
ENV RADAR_POOL_MAX_ACTIVE "10"
12+
ENV RADAR_POOL_MAX_IDLE "5"
13+
ENV RADAR_POOL_MIN_IDLE "2"
14+
15+
CMD ["java","-jar","/radar/radar-standalone.jar"]
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package mil.army.usace.hec;
2+
3+
import java.util.logging.Level;
4+
import java.util.logging.Logger;
5+
6+
import com.codahale.metrics.Meter;
7+
import com.codahale.metrics.MetricRegistry;
8+
9+
//import java.sql.DriverManager;
10+
11+
import io.javalin.Javalin;
12+
import static io.javalin.apibuilder.ApiBuilder.*;
13+
import io.javalin.core.plugin.Plugin;
14+
import io.javalin.plugin.openapi.OpenApiOptions;
15+
import io.javalin.plugin.openapi.OpenApiPlugin;
16+
import io.javalin.plugin.openapi.ui.SwaggerOptions;
17+
import io.swagger.v3.oas.models.info.Info;
18+
19+
import cwms.radar.api.*;
20+
21+
import org.apache.tomcat.jdbc.pool.DataSource;
22+
23+
public class RadarAPI {
24+
private static final Logger logger = Logger.getLogger(RadarAPI.class.getName());
25+
private static final MetricRegistry metrics = new MetricRegistry();
26+
private static final Meter total_requests = metrics.meter("radar.total_requests");;
27+
public static void main(String args[]){
28+
DataSource ds = new DataSource();
29+
try{
30+
ds.setDriverClassName(getconfig("RADAR_JDBC_DRIVER","oracle.jdbc.driver.OracleDriver"));
31+
ds.setUrl(getconfig("RADAR_JDBC_URL","jdbc:oracle:thin:@localhost/CWMSDEV"));
32+
ds.setUsername(getconfig("RADAR_JDBC_USERNAME"));
33+
ds.setPassword(getconfig("RADAR_JDBC_PASSWORD"));
34+
ds.setInitialSize(Integer.parseInt(getconfig("RADAR_POOL_INIT_SIZE","5")));
35+
ds.setMaxActive(Integer.parseInt(getconfig("RADAR_POOL_MAX_ACTIVE","10")));
36+
ds.setMaxIdle(Integer.parseInt(getconfig("RADAR_POOL_MAX_IDLE","5")));
37+
ds.setMinIdle(Integer.parseInt(getconfig("RADAR_POOL_MIN_IDLE","2")));
38+
} catch( Exception err ){
39+
logger.log(Level.SEVERE,"Required Parameter not set in environment",err);
40+
System.exit(1);
41+
}
42+
43+
44+
int port = Integer.parseInt(System.getProperty("RADAR_LISTEN_PORT","7000"));
45+
46+
Javalin app = Javalin.create( config -> {
47+
config.defaultContentType = "application/json";
48+
config.contextPath = "/";
49+
config.registerPlugin((Plugin) new OpenApiPlugin(getOpenApiOptions()));
50+
if( System.getProperty("RADAR_DEBUG_LOGGING","false").equalsIgnoreCase("true")){
51+
config.enableDevLogging();
52+
}
53+
config.requestLogger( (ctx,ms) -> { logger.info(ctx.toString());} );
54+
}).before( ctx -> {
55+
ctx.attribute("database",ds.getConnection());
56+
/* authorization on connection setup will go here
57+
Connection conn = ctx.attribute("db");
58+
*/
59+
total_requests.mark();
60+
}).after( ctx -> {
61+
((java.sql.Connection)ctx.attribute("database")).close();
62+
})
63+
.exception(Exception.class, (e,ctx) -> {
64+
logger.log(Level.WARNING,"error on request: " + ctx.req.getRequestURI(),e);
65+
})
66+
.routes( () -> {
67+
get("/", ctx -> { ctx.result("welcome to the CWMS REST APi").contentType("text/plain");});
68+
crud("/locations/:location_code", new LocationController(metrics));
69+
crud("/offices/:office", new OfficeController(metrics));
70+
crud("/units/:unit_name", new UnitsController(metrics));
71+
crud("/parameters/:param_name", new ParametersController(metrics));
72+
crud("/timezones/:zone", new TimeZoneController(metrics));
73+
crud("/levels/:location", new LevelsController(metrics));
74+
crud("/timeseries/:timeseries", new TimeSeriesController(metrics));
75+
crud("/ratings/:rating", new RatingController(metrics));
76+
}).start(port);
77+
78+
}
79+
80+
private static OpenApiOptions getOpenApiOptions() {
81+
Info applicationInfo = new Info().version("2.0").description("CWMS REST API for Data Retrieval");
82+
OpenApiOptions options = new OpenApiOptions(applicationInfo)
83+
.path("/swagger-docs")
84+
.swagger( new SwaggerOptions("/swagger-ui"))
85+
.activateAnnotationScanningFor("cwms.radar.api");
86+
return options;
87+
}
88+
89+
private static String getconfig(String envName){
90+
return System.getenv(envName);
91+
}
92+
private static String getconfig(String envName,String defaultVal){
93+
String val = System.getenv(envName);
94+
return val != null ? val : defaultVal;
95+
}
96+
}

cwms_radar_tomcat/src/main/java/cwms/radar/ApiServlet.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,12 @@ private OpenApiOptions getOpenApiOptions() {
102102
@Override
103103
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
104104
total_requests.mark();
105-
try (Connection db = cwms.getConnection() ) {
105+
try (Connection db = cwms.getConnection() ) {
106+
String office = req.getContextPath().substring(1).split("-")[0];//
107+
if( office.equalsIgnoreCase("cwms")){
108+
office = "HQ";
109+
}
110+
req.setAttribute("office_id", office.toUpperCase());
106111
req.setAttribute("database", db);
107112
javalin.service(req, resp);
108113
} catch (SQLException ex) {

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ include 'services:webservice'
1818
rootProject.name = 'cwms_rest_api'
1919

2020
include ":cwms_radar_api"
21-
include ":cwms_radar_cwbi"
21+
include ":cwms_radar_standalone"
2222
include ":cwms_radar_tomcat"

0 commit comments

Comments
 (0)