Refine deployment process
- Build, upload solver docker image. - Remove deployment job: the solver is not deployed on the Nebulous cluster, but is deployed by SAL on each app cluster. - Adapt helm chart; SAL might use it to deploy the solver. - Add AMPL license file contents to nebulous secrets store, pass it in via helm charts. Note that it's ok to run without a license file. - For testing purposes, add a docker-compose.yaml file - Pacify hadolint: when installing packages in Dockerfile, specify package versions. - Pacify shellcheck: fix warnings in start-solver.sh - Pacify podman: do not use heredocs for RUN. - Remove Spring Boot demo application. Change-Id: I757a440d09082b5824f36a81cb82d6e5c169a699
This commit is contained in:
parent
5c67c7c7e0
commit
72b2007bc4
64
Dockerfile
64
Dockerfile
@ -1,50 +1,62 @@
|
|||||||
# syntax=docker/dockerfile:1.3-labs
|
|
||||||
FROM fedora:39 AS builder
|
FROM fedora:39 AS builder
|
||||||
|
|
||||||
# To build:
|
# To build:
|
||||||
# docker build -t nebulous/solver .
|
# 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
|
WORKDIR /solver
|
||||||
COPY ./ /solver
|
|
||||||
|
|
||||||
RUN <<EOF
|
# Development framework, dependencies
|
||||||
# Development framework
|
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 --assumeyes install gcc-c++ make git-core boost boost-devel ccache qpid-proton-cpp qpid-proton-cpp-devel json-c json-devel json-glib jsoncpp jsoncpp-devel coin-or-Couenne wget
|
dnf clean all && \
|
||||||
# Dependencies
|
git clone https://github.com/jarro2783/cxxopts.git CxxOpts && \
|
||||||
git clone https://github.com/jarro2783/cxxopts.git CxxOpts
|
git clone https://github.com/GeirHo/TheronPlusPlus.git Theron++ && \
|
||||||
git clone https://github.com/GeirHo/TheronPlusPlus.git Theron++
|
|
||||||
mkdir Theron++/Bin
|
mkdir Theron++/Bin
|
||||||
|
|
||||||
# Install AMPL library
|
# Install AMPL library
|
||||||
wget --no-verbose https://portal.ampl.com/external/?url=https://portal.ampl.com/dl/amplce/ampl.linux64.tgz -O ampl.linux64.tgz
|
RUN wget --progress=dot:giga https://portal.ampl.com/external/?url=https://portal.ampl.com/dl/amplce/ampl.linux64.tgz -O ampl.linux64.tgz && \
|
||||||
tar --file=ampl.linux64.tgz --extract
|
tar --file=ampl.linux64.tgz --extract && \
|
||||||
mv ampl.linux-intel64 AMPL
|
mv ampl.linux-intel64 AMPL && \
|
||||||
rm ampl.linux64.tgz
|
rm ampl.linux64.tgz
|
||||||
EOF
|
|
||||||
|
|
||||||
# Make AMPL shared libraries findable
|
# Make AMPL shared libraries findable
|
||||||
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/solver/AMPL:/solver/AMPL/amplapi/lib"
|
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/solver/AMPL:/solver/AMPL/amplapi/lib"
|
||||||
|
|
||||||
|
COPY . /solver
|
||||||
|
|
||||||
# Build solver
|
# Build solver
|
||||||
RUN make SolverComponent -e THERON=./Theron++ AMPL_INCLUDE=./AMPL/amplapi/include AMPL_LIB=./AMPL/amplapi/lib CxxOpts_DIR=./CxxOpts/include
|
RUN make SolverComponent -e THERON=./Theron++ AMPL_INCLUDE=./AMPL/amplapi/include AMPL_LIB=./AMPL/amplapi/lib CxxOpts_DIR=./CxxOpts/include && \
|
||||||
|
make clean
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
FROM fedora:39
|
FROM fedora:39
|
||||||
WORKDIR /solver
|
WORKDIR /solver
|
||||||
RUN dnf --assumeyes install boost qpid-proton-cpp json-c json-glib jsoncpp coin-or-Couenne
|
RUN dnf --assumeyes install boost-1.81.0-8.fc39 qpid-proton-cpp-0.38.0-4.fc39 json-c-0.17-1.fc39 json-glib-1.8.0-1.fc39 jsoncpp-1.9.5-5.fc39 coin-or-Couenne-0.5.8-12.fc39 && \
|
||||||
|
dnf clean all
|
||||||
|
|
||||||
COPY --from=builder /solver /solver
|
COPY --from=builder /solver /solver
|
||||||
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/solver/AMPL:/solver/AMPL/amplapi/lib"
|
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/solver/AMPL:/solver/AMPL/amplapi/lib"
|
||||||
|
|
||||||
#
|
# The `SolverComponent` arguments `--ModelDir` and `--AMPLDir` are
|
||||||
# We set constant `--ModelDir` and `--AMPLDir`; the other arguments can be
|
# constant, the other arguments can be given on the command line or
|
||||||
# given on the command line, like so (note that `--Endpoint` is mandatory):
|
# via environment variables:
|
||||||
#
|
#
|
||||||
# docker run nebulous/solver --Broker=https://somewhere.else/ --Endpoint=my-app-id
|
# -b amqbroker (variable ACTIVEMQ_HOST, default localhost)
|
||||||
#
|
# -P amqpport (variable ACTIVEMQ_PORT, default 5672)
|
||||||
# For a shell, to diagnose problems etc.:
|
# -u user (variable ACTIVEMQ_USER, default admin)
|
||||||
# docker run --rm -it --entrypoint /bin/bash nebulous/solver
|
# -p amqppassword (variable ACTIVEMQ_PASSWORD)
|
||||||
ENTRYPOINT ["/solver/SolverComponent", "--ModelDir=/tmp", "--AMPLDir=/solver/AMPL"]
|
# -e appid (variable APPLICATION_ID)
|
||||||
|
# -l license (variable AMPL_LICENSE)
|
||||||
|
#
|
||||||
|
# The docker can be started with explicit parameters, environment
|
||||||
|
# variables or a mix of both. Parameters override variables.
|
||||||
|
#
|
||||||
|
# docker run -e APPLICATION_ID="my_app_id" nebulous/solver -b="https://amqp.example.com/" -p=s3kr1t
|
||||||
|
#
|
||||||
|
|
||||||
|
ENTRYPOINT ["/solver/start-solver.sh"]
|
||||||
|
@ -33,20 +33,26 @@ spec:
|
|||||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
ports:
|
|
||||||
- name: http
|
|
||||||
containerPort: 8080
|
|
||||||
protocol: TCP
|
|
||||||
livenessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /
|
|
||||||
port: http
|
|
||||||
readinessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /
|
|
||||||
port: http
|
|
||||||
resources:
|
resources:
|
||||||
{{- toYaml .Values.resources | nindent 12 }}
|
{{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
env:
|
||||||
|
- name: APPLICATION_ID
|
||||||
|
- name: ACTIVEMQ_HOST
|
||||||
|
value: {{ .Values.activemq.ACTIVEMQ_HOST }}
|
||||||
|
- name: ACTIVEMQ_PORT
|
||||||
|
value: {{ .Values.activemq.ACTIVEMQ_PORT }}
|
||||||
|
- name: ACTIVEMQ_USER
|
||||||
|
value: {{ .Values.activemq.ACTIVEMQ_USER }}
|
||||||
|
- name: ACTIVEMQ_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Values.activemqSecret.secretName }}
|
||||||
|
key: {{ .Values.activemqSecret.secretKey }}
|
||||||
|
- name: AMPL_LICENSE
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Values.amplLicense.secretName }}
|
||||||
|
key: {{ .Values.amplLicense.secretKey }}
|
||||||
{{- with .Values.nodeSelector }}
|
{{- with .Values.nodeSelector }}
|
||||||
nodeSelector:
|
nodeSelector:
|
||||||
{{- toYaml . | nindent 8 }}
|
{{- toYaml . | nindent 8 }}
|
||||||
@ -59,3 +65,4 @@ spec:
|
|||||||
tolerations:
|
tolerations:
|
||||||
{{- toYaml . | nindent 8 }}
|
{{- toYaml . | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
image:
|
image:
|
||||||
repository: "quay.io/nebulous/optimiser-solver-java-spring-boot-demo"
|
repository: "quay.io/nebulous/optimiser-solver"
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
# Overrides the image tag whose default is the chart appVersion.
|
# Overrides the image tag whose default is the chart appVersion.
|
||||||
tag: ""
|
tag: ""
|
||||||
@ -36,10 +36,6 @@ securityContext: {}
|
|||||||
# runAsNonRoot: true
|
# runAsNonRoot: true
|
||||||
# runAsUser: 1000
|
# runAsUser: 1000
|
||||||
|
|
||||||
service:
|
|
||||||
type: ClusterIP
|
|
||||||
port: 80
|
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: false
|
enabled: false
|
||||||
className: ""
|
className: ""
|
||||||
@ -80,3 +76,16 @@ nodeSelector: {}
|
|||||||
tolerations: []
|
tolerations: []
|
||||||
|
|
||||||
affinity: {}
|
affinity: {}
|
||||||
|
|
||||||
|
activemq:
|
||||||
|
ACTIVEMQ_HOST: nebulous-activemq
|
||||||
|
ACTIVEMQ_PORT: 5672
|
||||||
|
ACTIVEMQ_USER: admin
|
||||||
|
|
||||||
|
activemqSecret:
|
||||||
|
secretName: "activeMqPassword"
|
||||||
|
secretKey: "ACTIVEMQ_PASSWORD"
|
||||||
|
|
||||||
|
amplLicense:
|
||||||
|
secretName: "ampl-license"
|
||||||
|
secretKey: "AMPL_LICENSE"
|
||||||
|
46
docker-compose.yaml
Normal file
46
docker-compose.yaml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# This file tests starting the solver inside a container. Since the
|
||||||
|
# solver will not start without a connection to an ActiveMQ broker,
|
||||||
|
# start one alongside it.
|
||||||
|
|
||||||
|
# If we have an application id, run the solver like this:
|
||||||
|
#
|
||||||
|
# APPLICATION_ID="my_application_id" docker-compose up
|
||||||
|
#
|
||||||
|
services:
|
||||||
|
activemq:
|
||||||
|
image: apache/activemq-classic
|
||||||
|
ports:
|
||||||
|
- "61616:61616"
|
||||||
|
- "5672:5672"
|
||||||
|
- "8161:8161"
|
||||||
|
networks:
|
||||||
|
- nebulous-activemq
|
||||||
|
container_name: myActiveMQ
|
||||||
|
environment:
|
||||||
|
ACTIVEMQ_WEB_USER: admin
|
||||||
|
ACTIVEMQ_WEB_PASSWORD: admin
|
||||||
|
container_name: activemq
|
||||||
|
healthcheck:
|
||||||
|
test: curl -u admin:admin -H origin:localhost --silent --show-error "http://localhost:8161/api/jolokia/exec/org.apache.activemq:type=Broker,brokerName=localhost,service=Health/healthStatus" | tee /dev/tty | grep --silent -e 'Getting Worried' -e 'Good'
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
solver:
|
||||||
|
image: nebulous/solver
|
||||||
|
depends_on:
|
||||||
|
activemq:
|
||||||
|
condition: service_healthy
|
||||||
|
links:
|
||||||
|
- activemq
|
||||||
|
networks:
|
||||||
|
- nebulous-activemq
|
||||||
|
environment:
|
||||||
|
ACTIVEMQ_HOST: activemq
|
||||||
|
APPLICATION_ID: ${APPLICATION_ID:-invalid-application-id}
|
||||||
|
# Note that an invalid license crashes the solver; no license lets it start
|
||||||
|
AMPL_LICENSE: ${AMPL_LICENSE}
|
||||||
|
container_name: solver
|
||||||
|
|
||||||
|
networks:
|
||||||
|
nebulous-activemq:
|
33
java-spring-boot-demo/.gitignore
vendored
33
java-spring-boot-demo/.gitignore
vendored
@ -1,33 +0,0 @@
|
|||||||
HELP.md
|
|
||||||
target/
|
|
||||||
!.mvn/wrapper/maven-wrapper.jar
|
|
||||||
!**/src/main/**/target/
|
|
||||||
!**/src/test/**/target/
|
|
||||||
|
|
||||||
### STS ###
|
|
||||||
.apt_generated
|
|
||||||
.classpath
|
|
||||||
.factorypath
|
|
||||||
.project
|
|
||||||
.settings
|
|
||||||
.springBeans
|
|
||||||
.sts4-cache
|
|
||||||
|
|
||||||
### IntelliJ IDEA ###
|
|
||||||
.idea
|
|
||||||
*.iws
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
|
|
||||||
### NetBeans ###
|
|
||||||
/nbproject/private/
|
|
||||||
/nbbuild/
|
|
||||||
/dist/
|
|
||||||
/nbdist/
|
|
||||||
/.nb-gradle/
|
|
||||||
build/
|
|
||||||
!**/src/main/**/build/
|
|
||||||
!**/src/test/**/build/
|
|
||||||
|
|
||||||
### VS Code ###
|
|
||||||
.vscode/
|
|
@ -1,15 +0,0 @@
|
|||||||
#
|
|
||||||
# Build stage
|
|
||||||
#
|
|
||||||
FROM docker.io/library/maven:3.9.2-eclipse-temurin-17 AS build
|
|
||||||
COPY src /home/app/src
|
|
||||||
COPY pom.xml /home/app
|
|
||||||
RUN mvn -f /home/app/pom.xml clean package
|
|
||||||
|
|
||||||
#
|
|
||||||
# Package stage
|
|
||||||
#
|
|
||||||
FROM docker.io/library/eclipse-temurin:17-jre
|
|
||||||
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
|
|
||||||
EXPOSE 8080
|
|
||||||
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]
|
|
@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
|
||||||
<version>3.1.0</version>
|
|
||||||
<relativePath/> <!-- lookup parent from repository -->
|
|
||||||
</parent>
|
|
||||||
<groupId>com.example</groupId>
|
|
||||||
<artifactId>demo</artifactId>
|
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
|
||||||
<name>demo</name>
|
|
||||||
<description>Demo project for Spring Boot</description>
|
|
||||||
<properties>
|
|
||||||
<java.version>17</java.version>
|
|
||||||
</properties>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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() {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
64
makefile
64
makefile
@ -3,21 +3,21 @@
|
|||||||
# Solver component
|
# Solver component
|
||||||
#
|
#
|
||||||
# The NebulOuS solver consists of several interacting actors using the AMQ
|
# 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
|
# the file
|
||||||
#
|
#
|
||||||
# ccache # for effcient C++ compilations
|
# ccache # for effcient C++ compilations
|
||||||
# qpid-proton-cpp* # Qpid Proton Active Message Queue protocol API
|
# qpid-proton-cpp* # Qpid Proton Active Message Queue protocol API
|
||||||
# json-devel # Niels Lohmann's JSON library
|
# json-devel # Niels Lohmann's JSON library
|
||||||
# coin-or-Couenne # The solver to be used by AMPL
|
# 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
|
# Language (AMPL) and so it should be installed from
|
||||||
# https://portal.ampl.com/user/ampl/request/amplce/trial/new
|
# 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
|
# Theron++ # https://github.com/GeirHo/TheronPlusPlus.git
|
||||||
# cxxopts # https://github.com/jarro2783/cxxopts.git
|
# cxxopts # https://github.com/jarro2783/cxxopts.git
|
||||||
@ -39,7 +39,7 @@ RM = rm -f
|
|||||||
# Paths
|
# 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.
|
# definitions on the command line for creating the component container.
|
||||||
#
|
#
|
||||||
# Location of the Theron++ framework relative to this make file and the code
|
# 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
|
AMPL_LIB ?= /opt/AMPL/amplapi/lib
|
||||||
|
|
||||||
# The solver component uses the CxxOpts class for parsing the command line
|
# 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
|
# 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
|
# boost, which seems to have lost the most recent C++ features. The CxxOpts
|
||||||
# library can be cloned from https://github.com/jarro2783/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
|
# Options for the compiler and linker
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Optimisation -O3 is the highest level of optimisation and should be used
|
# Optimisation -O3 is the highest level of optimisation and should be used
|
||||||
# with production code. -Og is the code optimising and offering debugging
|
# with production code. -Og is the code optimising and offering debugging
|
||||||
# transparency and should be use while the code is under development
|
# transparency and should be use while the code is under development
|
||||||
|
|
||||||
OPTIMISATION_FLAG = -Og
|
OPTIMISATION_FLAG = -Og
|
||||||
|
|
||||||
# It is useful to let the compiler generate the dependencies for the various
|
# 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
|
# 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
|
# 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
|
# 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
|
# empty rule to create the dependencies so that make would not create any errors
|
||||||
# if the file name changes.
|
# if the file name changes.
|
||||||
|
|
||||||
DEPENDENCY_FLAGS = -MMD -MP
|
DEPENDENCY_FLAGS = -MMD -MP
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
|
|
||||||
GENERAL_OPTIONS = -Wall -std=c++23 -ggdb -D_DEBUG
|
GENERAL_OPTIONS = -Wall -std=c++23 -ggdb -D_DEBUG
|
||||||
INCLUDE_DIRECTORIES = -I. -I/usr/include -I$(THERON) -I$(AMPL_INCLUDE) \
|
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) \
|
CXXFLAGS = $(GENERAL_OPTIONS) $(INCLUDE_DIRECTORIES) $(DEPENDENCY_FLAGS) \
|
||||||
$(OPTIMISATION_FLAG)
|
$(OPTIMISATION_FLAG)
|
||||||
|
|
||||||
# Putting it together as the actual options given to the compiler and the
|
# 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
|
# linker. Note that pthread is needed on Linux systems since it seems to
|
||||||
# be the underlying implementation of std::thread. Note that it is
|
# be the underlying implementation of std::thread. Note that it is
|
||||||
# necessary to use the "gold" linker as the standard linker requires
|
# necessary to use the "gold" linker as the standard linker requires
|
||||||
# the object files in the right order, which is hard to ensure with
|
# 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
|
# an archive, and the "gold" linker manages this just fine, but it
|
||||||
# requires the full static path to the custom Theron library.
|
# requires the full static path to the custom Theron library.
|
||||||
|
|
||||||
CFLAGS = $(DEPENDENCY_FLAGS) $(OPTIMISATION_FLAG) $(GENERAL_OPTIONS)
|
CFLAGS = $(DEPENDENCY_FLAGS) $(OPTIMISATION_FLAG) $(GENERAL_OPTIONS)
|
||||||
@ -105,13 +105,13 @@ LDFLAGS = -fuse-ld=gold -ggdb -D_DEBUG -pthread $(THERON)/Theron++.a \
|
|||||||
# Theron library
|
# Theron library
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# The Theron++ library must be built first and the following two targets
|
# 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
|
# ensures that Make will check if the libray is up-to-date or build it if
|
||||||
# it is not.
|
# it is not.
|
||||||
|
|
||||||
.PHONY: $(THERON)/Theron++.a
|
.PHONY: $(THERON)/Theron++.a
|
||||||
|
|
||||||
$(THERON)/Theron++.a:
|
$(THERON)/Theron++.a:
|
||||||
make -C $(THERON) Library
|
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.
|
# the object files or the solver actors.
|
||||||
|
|
||||||
SolverComponent: $(SOLVER_OBJECTS) $(THERON)/Theron++.a
|
SolverComponent: $(SOLVER_OBJECTS) $(THERON)/Theron++.a
|
||||||
$(CC) -o SolverComponent $(CXXFLAGS) $(SOLVER_OBJECTS) $(LDFLAGS)
|
$(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
|
# files
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@ -156,4 +156,4 @@ clean:
|
|||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|
||||||
-include $(SOLVER_OBJECTS:.o=.d)
|
-include $(SOLVER_OBJECTS:.o=.d)
|
||||||
|
38
start-solver.sh
Executable file
38
start-solver.sh
Executable file
@ -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"
|
@ -8,15 +8,15 @@
|
|||||||
- nebulous-optimiser-solver-container-images
|
- nebulous-optimiser-solver-container-images
|
||||||
description: Build the container images.
|
description: Build the container images.
|
||||||
files: &image_files
|
files: &image_files
|
||||||
- ^java-spring-boot-demo/
|
- ^/
|
||||||
vars: &image_vars
|
vars: &image_vars
|
||||||
promote_container_image_job: nebulous-optimiser-solver-upload-container-images
|
promote_container_image_job: nebulous-optimiser-solver-upload-container-images
|
||||||
container_images:
|
container_images:
|
||||||
- context: java-spring-boot-demo
|
- context: .
|
||||||
registry: quay.io
|
registry: quay.io
|
||||||
repository: quay.io/nebulous/optimiser-solver-java-spring-boot-demo
|
repository: quay.io/nebulous/optimiser-solver
|
||||||
namespace: nebulous
|
namespace: nebulous
|
||||||
repo_shortname: optimiser-solver-java-spring-boot-demo
|
repo_shortname: optimiser-solver
|
||||||
repo_description: ""
|
repo_description: ""
|
||||||
|
|
||||||
- job:
|
- job:
|
||||||
@ -44,7 +44,7 @@
|
|||||||
description: Run Hadolint on Dockerfile(s).
|
description: Run Hadolint on Dockerfile(s).
|
||||||
vars:
|
vars:
|
||||||
dockerfiles:
|
dockerfiles:
|
||||||
- java-spring-boot-demo/Dockerfile
|
- Dockerfile
|
||||||
|
|
||||||
- job:
|
- job:
|
||||||
name: nebulous-optimiser-solver-helm-lint
|
name: nebulous-optimiser-solver-helm-lint
|
||||||
@ -53,20 +53,3 @@
|
|||||||
vars:
|
vars:
|
||||||
helm_charts:
|
helm_charts:
|
||||||
- ./charts/nebulous-optimiser-solver
|
- ./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
|
|
||||||
|
@ -2,18 +2,14 @@
|
|||||||
check:
|
check:
|
||||||
jobs:
|
jobs:
|
||||||
- opendev-buildset-registry
|
- opendev-buildset-registry
|
||||||
- nebulous-optimiser-solver-helm-lint
|
|
||||||
- nebulous-optimiser-solver-build-container-images
|
- nebulous-optimiser-solver-build-container-images
|
||||||
- nebulous-optimiser-solver-hadolint
|
- nebulous-optimiser-solver-hadolint
|
||||||
- nebulous-platform-apply-helm-charts
|
|
||||||
- nox-linters
|
- nox-linters
|
||||||
gate:
|
gate:
|
||||||
jobs:
|
jobs:
|
||||||
- opendev-buildset-registry
|
- opendev-buildset-registry
|
||||||
- nebulous-optimiser-solver-helm-lint
|
|
||||||
- nebulous-optimiser-solver-upload-container-images
|
- nebulous-optimiser-solver-upload-container-images
|
||||||
- nebulous-optimiser-solver-hadolint
|
- nebulous-optimiser-solver-hadolint
|
||||||
- nebulous-platform-apply-helm-charts
|
|
||||||
- nox-linters
|
- nox-linters
|
||||||
promote:
|
promote:
|
||||||
jobs:
|
jobs:
|
||||||
|
Loading…
Reference in New Issue
Block a user