diff --git a/Dockerfile b/Dockerfile index 600070d..99f4a1d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,62 +1,50 @@ +# syntax=docker/dockerfile:1.3-labs FROM fedora:39 AS builder # To build: # docker build -t nebulous/solver . -# -# For a shell, to diagnose problems etc.: -# docker run --rm -it --entrypoint /bin/bash nebulous/solver +# To run, resulting in a terminal for further experiments: +# docker run -it nebulous/solver -RUN mkdir -p /solver WORKDIR /solver +COPY ./ /solver -# Development framework, dependencies -RUN dnf --assumeyes install gcc-c++-13.2.1-6.fc39 make-1:4.4.1-2.fc39 git-core-2.44.0-1.fc39 boost-devel-1.81.0-8.fc39 ccache-4.8.2-2.fc39 qpid-proton-cpp-devel-0.38.0-4.fc39 json-c-0.17-1.fc39 json-devel-3.11.2-3.fc39 json-glib-1.8.0-1.fc39 jsoncpp-1.9.5-5.fc39 jsoncpp-devel-1.9.5-5.fc39 coin-or-Couenne-0.5.8-12.fc39 wget-1.21.3-7.fc39 && \ - dnf clean all && \ - git clone https://github.com/jarro2783/cxxopts.git CxxOpts && \ - git clone https://github.com/GeirHo/TheronPlusPlus.git Theron++ && \ +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 new file mode 100644 index 0000000..094d95b --- /dev/null +++ b/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java @@ -0,0 +1,13 @@ +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 new file mode 100644 index 0000000..61a5075 --- /dev/null +++ b/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..e69de29 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 new file mode 100644 index 0000000..eaa9969 --- /dev/null +++ b/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +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 835de05..f49290a 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 addition the problem is formulated using A Mathematical Programming +# In addtition the problem is formuated 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) +-include $(SOLVER_OBJECTS:.o=.d) \ No newline at end of file diff --git a/start-solver.sh b/start-solver.sh deleted file mode 100755 index 049da63..0000000 --- a/start-solver.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/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 02b6dac..fa5a4ef 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: . + - context: java-spring-boot-demo registry: quay.io - repository: quay.io/nebulous/optimiser-solver + repository: quay.io/nebulous/optimiser-solver-java-spring-boot-demo namespace: nebulous - repo_shortname: optimiser-solver + repo_shortname: optimiser-solver-java-spring-boot-demo repo_description: "" - job: @@ -44,7 +44,7 @@ description: Run Hadolint on Dockerfile(s). vars: dockerfiles: - - Dockerfile + - java-spring-boot-demo/Dockerfile - job: name: nebulous-optimiser-solver-helm-lint @@ -53,3 +53,20 @@ 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 70c03b7..845b1a1 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -2,14 +2,18 @@ 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: