diff --git a/Dockerfile b/Dockerfile index 99f4a1d..600070d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,50 +1,62 @@ -# syntax=docker/dockerfile:1.3-labs FROM fedora:39 AS builder # To build: # docker build -t nebulous/solver . -# To run, resulting in a terminal for further experiments: -# docker run -it nebulous/solver +# +# For a shell, to diagnose problems etc.: +# docker run --rm -it --entrypoint /bin/bash nebulous/solver +RUN mkdir -p /solver WORKDIR /solver -COPY ./ /solver -RUN < - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.1.0 - - - com.example - demo - 0.0.1-SNAPSHOT - demo - Demo project for Spring Boot - - 17 - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java b/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java deleted file mode 100644 index 094d95b..0000000 --- a/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DemoApplication { - - public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); - } - -} diff --git a/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java b/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java deleted file mode 100644 index 61a5075..0000000 --- a/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.demo; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class DemoController { - - @RequestMapping("/") - public Object root() { - return null; - } - -} diff --git a/java-spring-boot-demo/src/main/resources/application.properties b/java-spring-boot-demo/src/main/resources/application.properties deleted file mode 100644 index e69de29..0000000 diff --git a/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java b/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java deleted file mode 100644 index eaa9969..0000000 --- a/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DemoApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/makefile b/makefile index f49290a..835de05 100644 --- a/makefile +++ b/makefile @@ -3,21 +3,21 @@ # Solver component # # The NebulOuS solver consists of several interacting actors using the AMQ -# interface of the Theron++ framework. +# interface of the Theron++ framework. # -# The following packages should be available on Fedora prior to compiling +# The following packages should be available on Fedora prior to compiling # the file -# -# ccache # for effcient C++ compilations -# qpid-proton-cpp* # Qpid Proton Active Message Queue protocol API -# json-devel # Niels Lohmann's JSON library +# +# ccache # for effcient C++ compilations +# qpid-proton-cpp* # Qpid Proton Active Message Queue protocol API +# json-devel # Niels Lohmann's JSON library # coin-or-Couenne # The solver to be used by AMPL # -# In addtition the problem is formuated using A Mathematical Programming +# In addition the problem is formulated using A Mathematical Programming # Language (AMPL) and so it should be installed from # https://portal.ampl.com/user/ampl/request/amplce/trial/new # -# There are source code dependencies that should be cloned to local disk +# There are source code dependencies that should be cloned to local disk # # Theron++ # https://github.com/GeirHo/TheronPlusPlus.git # cxxopts # https://github.com/jarro2783/cxxopts.git @@ -39,7 +39,7 @@ RM = rm -f # Paths #------------------------------------------------------------------------------ # -# The default values of the paths are given here to be overridden by build +# The default values of the paths are given here to be overridden by build # definitions on the command line for creating the component container. # # Location of the Theron++ framework relative to this make file and the code @@ -54,8 +54,8 @@ AMPL_INCLUDE ?= /opt/AMPL/amplapi/include AMPL_LIB ?= /opt/AMPL/amplapi/lib -# The solver component uses the CxxOpts class for parsing the command line -# options since it is header only and lighter than the Options library of +# The solver component uses the CxxOpts class for parsing the command line +# options since it is header only and lighter than the Options library of # boost, which seems to have lost the most recent C++ features. The CxxOpts # library can be cloned from https://github.com/jarro2783/cxxopts @@ -65,22 +65,22 @@ CxxOpts_DIR ?= /home/GHo/Documents/Code/CxxOpts/include # Options for the compiler and linker #------------------------------------------------------------------------------ # -# Optimisation -O3 is the highest level of optimisation and should be used -# with production code. -Og is the code optimising and offering debugging +# Optimisation -O3 is the highest level of optimisation and should be used +# with production code. -Og is the code optimising and offering debugging # transparency and should be use while the code is under development OPTIMISATION_FLAG = -Og -# It is useful to let the compiler generate the dependencies for the various -# files, and the following will produce .d files that can be included at the -# end. The -MMD flag is equivalent with -MD, but the latter will include system -# headers in the output (which we do not need here). The -MP includes an -# empty rule to create the dependencies so that make would not create any errors +# It is useful to let the compiler generate the dependencies for the various +# files, and the following will produce .d files that can be included at the +# end. The -MMD flag is equivalent with -MD, but the latter will include system +# headers in the output (which we do not need here). The -MP includes an +# empty rule to create the dependencies so that make would not create any errors # if the file name changes. DEPENDENCY_FLAGS = -MMD -MP -# Options +# Options GENERAL_OPTIONS = -Wall -std=c++23 -ggdb -D_DEBUG INCLUDE_DIRECTORIES = -I. -I/usr/include -I$(THERON) -I$(AMPL_INCLUDE) \ @@ -89,12 +89,12 @@ INCLUDE_DIRECTORIES = -I. -I/usr/include -I$(THERON) -I$(AMPL_INCLUDE) \ CXXFLAGS = $(GENERAL_OPTIONS) $(INCLUDE_DIRECTORIES) $(DEPENDENCY_FLAGS) \ $(OPTIMISATION_FLAG) -# Putting it together as the actual options given to the compiler and the -# linker. Note that pthread is needed on Linux systems since it seems to -# be the underlying implementation of std::thread. Note that it is -# necessary to use the "gold" linker as the standard linker requires -# the object files in the right order, which is hard to ensure with -# an archive, and the "gold" linker manages this just fine, but it +# Putting it together as the actual options given to the compiler and the +# linker. Note that pthread is needed on Linux systems since it seems to +# be the underlying implementation of std::thread. Note that it is +# necessary to use the "gold" linker as the standard linker requires +# the object files in the right order, which is hard to ensure with +# an archive, and the "gold" linker manages this just fine, but it # requires the full static path to the custom Theron library. CFLAGS = $(DEPENDENCY_FLAGS) $(OPTIMISATION_FLAG) $(GENERAL_OPTIONS) @@ -105,13 +105,13 @@ LDFLAGS = -fuse-ld=gold -ggdb -D_DEBUG -pthread $(THERON)/Theron++.a \ # Theron library #------------------------------------------------------------------------------ # -# The Theron++ library must be built first and the following two targets -# ensures that Make will check if the libray is up-to-date or build it if +# The Theron++ library must be built first and the following two targets +# ensures that Make will check if the libray is up-to-date or build it if # it is not. -.PHONY: $(THERON)/Theron++.a +.PHONY: $(THERON)/Theron++.a - $(THERON)/Theron++.a: +$(THERON)/Theron++.a: make -C $(THERON) Library #------------------------------------------------------------------------------ @@ -139,13 +139,13 @@ $(OBJECTS_DIR)/%.o : %.cpp #------------------------------------------------------------------------------ # -# The only real target is to build the solver component whenever some of +# The only real target is to build the solver component whenever some of # the object files or the solver actors. SolverComponent: $(SOLVER_OBJECTS) $(THERON)/Theron++.a $(CC) -o SolverComponent $(CXXFLAGS) $(SOLVER_OBJECTS) $(LDFLAGS) -# There is also a standard target to clean the automatically generated build +# There is also a standard target to clean the automatically generated build # files clean: @@ -156,4 +156,4 @@ clean: #------------------------------------------------------------------------------ # --include $(SOLVER_OBJECTS:.o=.d) \ No newline at end of file +-include $(SOLVER_OBJECTS:.o=.d) diff --git a/start-solver.sh b/start-solver.sh new file mode 100755 index 0000000..049da63 --- /dev/null +++ b/start-solver.sh @@ -0,0 +1,38 @@ +#!/usr/bin/bash + +# call bash directly since we know we're on Fedora +set -euf -o pipefail + +amqpbroker=${ACTIVEMQ_HOST:-localhost} +amqpport=${ACTIVEMQ_PORT:-5672} +amqpuser=${ACTIVEMQ_USER:-admin} +amqppassword=${ACTIVEMQ_PASSWORD:-} +appid=${APPLICATION_ID:-} +license=${AMPL_LICENSE:-} + +while getopts b:P:u:p:e:l: name +do + case $name in + b) amqpbroker="$OPTARG";; + p) amqppassword="$OPTARG";; + u) amqpuser="$OPTARG";; + P) amqpport="$OPTARG";; + e) appid="$OPTARG";; + l) license="$OPTARG";; + ?) printf "Usage: %s [-b amqbroker] [-P amqpport] [-u user] [-p amqppassword] [-e appid] [-l license]\n -b amqpbroker overrides ACTIVEMQ_HOST (default localhost)\n -P amqpport overrides ACTIVEMQ_PORT (default 5672)\n -u user overrides ACTIVEMQ_USER (default admin)\n -p amqppassword overrides ACTIVEMQ_PASSWORD\n -e appid overrides APPLICATION_ID\n -l license overrides AMPL_LICENSE\n" "$0" + exit 2;; + esac +done +if [ -z "${appid}" ]; then + printf "Missing Application ID, unable to start the solver" + exit 1 +fi + +if [ -n "${license}" ] ; then + echo "creating license file /solver/AMPL/ampl.lic" + echo "$license" > /solver/AMPL/ampl.lic +fi + +echo "Starting SolverComponent: app id='${appid}' broker='${amqpbroker}:${amqpport}'" && sync + +exec ./SolverComponent --AMPLDir=/solver/AMPL --ModelDir=/tmp --Broker="$amqpbroker" --Port="$amqpport" --User="$amqpuser" --Pw="$amqppassword" --Endpoint="$appid" diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index fa5a4ef..02b6dac 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -8,15 +8,15 @@ - nebulous-optimiser-solver-container-images description: Build the container images. files: &image_files - - ^java-spring-boot-demo/ + - ^/ vars: &image_vars promote_container_image_job: nebulous-optimiser-solver-upload-container-images container_images: - - context: java-spring-boot-demo + - context: . registry: quay.io - repository: quay.io/nebulous/optimiser-solver-java-spring-boot-demo + repository: quay.io/nebulous/optimiser-solver namespace: nebulous - repo_shortname: optimiser-solver-java-spring-boot-demo + repo_shortname: optimiser-solver repo_description: "" - job: @@ -44,7 +44,7 @@ description: Run Hadolint on Dockerfile(s). vars: dockerfiles: - - java-spring-boot-demo/Dockerfile + - Dockerfile - job: name: nebulous-optimiser-solver-helm-lint @@ -53,20 +53,3 @@ vars: helm_charts: - ./charts/nebulous-optimiser-solver - -- job: - name: nebulous-optimiser-solver-apply-helm-charts - parent: nebulous-apply-helm-charts - dependencies: - - name: opendev-buildset-registry - soft: false - - name: nebulous-optimiser-solver-build-container-images - soft: true - - name: nebulous-optimiser-solver-upload-container-images - soft: true - requires: - - nebulous-optimiser-solver-container-images - description: Deploy a Kubernetes cluster and apply charts. - vars: - helm_charts: - nebulous-optimiser-solver: ./charts/nebulous-optimiser-solver diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index 845b1a1..70c03b7 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -2,18 +2,14 @@ check: jobs: - opendev-buildset-registry - - nebulous-optimiser-solver-helm-lint - nebulous-optimiser-solver-build-container-images - nebulous-optimiser-solver-hadolint - - nebulous-platform-apply-helm-charts - nox-linters gate: jobs: - opendev-buildset-registry - - nebulous-optimiser-solver-helm-lint - nebulous-optimiser-solver-upload-container-images - nebulous-optimiser-solver-hadolint - - nebulous-platform-apply-helm-charts - nox-linters promote: jobs: