App Broker 2.0.x

Major dependencies updates:
* Spring Boot 3
* Spring Framework 6
* Spring Cloud Open Service Broker 4.0.0-SNAPSHOT
* Java 17
* Gradle 7.6

Dockerfile:
* Update to Ubuntu Jammy
* Bump to OpenJDK 17
* Remove usage of deprecated `apt-key` tool
* Bump all other tools to latest versions (bosh, bbl, credhub etc.)

ATs:
* Pass required java buildpack env var to use Java 17 on CF
* Update `cf login` invocation to work with cf-cli v8

Small improvements:
* Reliable datetime comparison in `InMemoryServiceInstanceStateRepositoryTest`
* Update `.editorconfig` to match existing style
* Add `.sdkmanrc`
This commit is contained in:
Gareth Clay
2022-11-25 16:59:46 +00:00
committed by Gareth Clay
parent d609cc4c11
commit ebf1fc66f3
35 changed files with 380 additions and 232 deletions

View File

@@ -8,3 +8,8 @@ indent_size=4
[*.{yml,yaml,sh}]
indent_style=space
indent_size=2
[*.java]
ij_java_class_count_to_use_import_on_demand = 100
ij_java_imports_layout = jakarta.**,|,java.**,|,*,|,org.springframework.**,|,$*
ij_java_names_count_to_use_import_on_demand = 100

View File

@@ -1,30 +1,28 @@
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: build
name: Gradle build
on:
push:
branches: [ main, 1.3.x, 1.2.x, 1.1.x ]
pull_request:
branches: [ main, 1.3.x, 1.2.x, 1.1.x ]
workflow_call:
inputs:
java-version:
required: true
type: string
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '8', '11' ]
name: Java ${{ matrix.Java }} build
name: Java ${{ inputs.java-version }} build
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java }}
distribution: adopt
java-version: ${{ inputs.java-version }}
distribution: temurin
- name: Cache Gradle packages
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: |
~/.gradle/caches

16
.github/workflows/java-17-baseline.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: Java 17 baseline build
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
strategy:
matrix:
java: [ '17' ]
uses: ./.github/workflows/gradle-build.yml
with:
java-version: ${{ matrix.java }}

16
.github/workflows/java-8-baseline.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: Java 8 baseline build
on:
push:
branches: [ 1.6.x, 1.5.x, 1.4.x ]
pull_request:
branches: [ 1.6.x, 1.5.x, 1.4.x ]
jobs:
build:
strategy:
matrix:
java: [ '8', '11', '17' ]
uses: ./.github/workflows/gradle-build.yml
with:
java-version: ${{ matrix.java }}

3
.sdkmanrc Normal file
View File

@@ -0,0 +1,3 @@
# Enable auto-env through the sdkman_auto_env config
# Add key=value pairs of SDKs to use below
java=17.0.5-librca

View File

@@ -18,32 +18,25 @@ import java.util.concurrent.ConcurrentHashMap
buildscript {
ext {
awaitilityVersion = "4.2.0"
blockHoundVersion = "1.0.6.RELEASE"
cfJavaClientVersion = "5.9.0.RELEASE"
checkstyleVersion = "8.37"
commonsTextVersion = "1.10.0"
immutablesVersion = "2.9.2"
openServiceBrokerVersion = "3.5.3"
pmdVersion = "6.29.0"
springBootVersion = "2.7.5"
springCredhubVersion = "2.3.0"
springFrameworkVersion = "5.3.22"
wiremockVersion = "2.27.2"
openServiceBrokerVersion = "4.0.0-SNAPSHOT"
springCredhubVersion = "3.0.0-SNAPSHOT"
springFrameworkVersion = "6.0.0"
wiremockVersion = "2.35.0"
}
}
plugins {
id "io.spring.nohttp" version "0.0.10"
id "io.spring.nohttp"
id 'distribution'
id 'jacoco'
}
ext {
javaApi = "https://docs.oracle.com/javase/8/docs/api/"
if (JavaVersion.current() >= JavaVersion.VERSION_11) {
javaApi = "https://docs.oracle.com/en/java/javase/11/docs/api"
}
javaApi = "https://docs.oracle.com/javase/17/docs/api/"
javadocLinks = [
javaApi,
"https://docs.spring.io/spring-framework/docs/${springFrameworkVersion}/javadoc-api/"
@@ -53,17 +46,6 @@ ext {
description = "Spring Cloud App Broker"
allprojects {
repositories {
mavenCentral()
maven { url "https://repo.spring.io/release" }
if (version =~ /((-M|-RC)[0-9]+|-SNAPSHOT)$/) {
maven { url "https://repo.spring.io/milestone" }
}
if (version.endsWith('-SNAPSHOT')) {
maven { url "https://repo.spring.io/snapshot" }
}
}
afterEvaluate { project ->
if (project.description == null || project.description.isEmpty()) {
throw new InvalidUserDataException("A project description is required for publishing to maven central")
@@ -78,8 +60,9 @@ configure(javaProjects) {
task dependencyReport(type: DependencyReportTask)
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
[compileJava, compileTestJava]*.options*.encoding = "UTF-8"
@@ -112,6 +95,11 @@ configure(javaProjects) {
scanForTestClasses = true
group = "verification"
// add jvm arg to resolve BlockHound issues, see https://github.com/reactor/BlockHound/issues/33
jvmArgs += [
"-XX:+AllowRedefinitionToAddDeleteMethods"
]
testLogging {
exceptionFormat = "full"
events = ["passed", "skipped", "failed"]
@@ -221,7 +209,6 @@ configure(staticAnalysisProjects) {
checkstyle {
configDirectory = rootProject.file("src/checkstyle")
toolVersion = "${checkstyleVersion}"
showViolations = true
}
checkstyleMain {
@@ -232,7 +219,6 @@ configure(staticAnalysisProjects) {
}
pmd {
toolVersion = "${pmdVersion}"
consoleOutput = true
}
pmdMain {
@@ -343,7 +329,7 @@ task api(type: Javadoc) {
}
distributions {
def documentation = copySpec {
def documentation = project.copySpec {
into('reference') {
from(project.tasks.findByPath(':spring-cloud-app-broker-docs:asciidoctor'),
project.tasks.findByPath(':spring-cloud-app-broker-docs:asciidoctorPdf'))
@@ -406,15 +392,15 @@ task codeCoverageReport(type: JacocoReport) {
}
reports {
xml.enabled true
xml.required = true
xml.destination new File("${buildDir}/reports/jacoco/report.xml")
html.enabled false
csv.enabled false
html.required = false
csv.required = false
}
}
wrapper {
gradleVersion = "7.5.1"
gradleVersion = "7.6"
}
nohttp {

View File

@@ -1,12 +1,17 @@
FROM harbor-repo.vmware.com/dockerhub-proxy-cache/library/ubuntu:bionic
FROM harbor-repo.vmware.com/dockerhub-proxy-cache/library/ubuntu:jammy
RUN apt-get update && apt-get install --no-install-recommends -y \
ca-certificates \
curl \
git \
gnupg \
jq \
net-tools
ARG BBL_CLI_VERSION=8.4.110
ARG BOSH_CLI_VERSION=7.0.1
ARG CONCOURSE_JAVA_SCRIPTS_VERSION=0.0.4
ARG CONCOURSE_RELEASE_SCRIPTS_VERSION=0.3.4
ARG CREDHUB_CLI_VERSION=2.9.8
RUN apt-get update && \
apt-get install --no-install-recommends -y \
ca-certificates \
curl \
gnupg && \
apt-get clean
RUN mkdir -p /etc/apt/keyrings
RUN curl -L 'https://cli.github.com/packages/githubcli-archive-keyring.gpg' | gpg --dearmor -o /etc/apt/keyrings/githubcli-archive-keyring.gpg
@@ -15,25 +20,23 @@ RUN curl -L 'https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key'
RUN echo "deb [signed-by=/etc/apt/keyrings/cloudfoundry-cli-keyring.gpg] https://packages.cloudfoundry.org/debian stable main" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list
RUN apt-get update && \
apt-get -qy --no-install-recommends install \
cf-cli \
gh && \
RUN apt-get update && \
apt-get install --no-install-recommends -y \
cf8-cli \
gh \
git \
jq \
net-tools \
openjdk-17-jdk-headless && \
apt-get clean
ENV JAVA_HOME /opt/openjdk
ENV PATH $JAVA_HOME/bin:$PATH
RUN mkdir -p /opt/openjdk && \
cd /opt/openjdk && \
curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_hotspot_8u292b10.tar.gz | tar xz --strip-components=1
ADD "https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v$CONCOURSE_JAVA_SCRIPTS_VERSION/concourse-java.sh" /opt/
ADD "https://repo.spring.io/libs-snapshot/io/spring/concourse/releasescripts/concourse-release-scripts/$CONCOURSE_RELEASE_SCRIPTS_VERSION/concourse-release-scripts-$CONCOURSE_RELEASE_SCRIPTS_VERSION.jar" /opt/
ADD https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.4/concourse-java.sh /opt/
ADD https://repo.spring.io/libs-snapshot/io/spring/concourse/releasescripts/concourse-release-scripts/0.3.4-SNAPSHOT/concourse-release-scripts-0.3.4-SNAPSHOT.jar /opt/
RUN cd /usr/local/bin && curl -L "https://github.com/cloudfoundry-incubator/credhub-cli/releases/download/$CREDHUB_CLI_VERSION/credhub-linux-$CREDHUB_CLI_VERSION.tgz" | tar xz
RUN cd /usr/local/bin && curl -L https://github.com/cloudfoundry-incubator/credhub-cli/releases/download/2.9.0/credhub-linux-2.9.0.tgz | tar xz
RUN curl -L https://github.com/cloudfoundry/bosh-bootloader/releases/download/v8.4.43/bbl-v8.4.43_linux_x86-64 --output /usr/local/bin/bbl && \
RUN curl -L "https://github.com/cloudfoundry/bosh-bootloader/releases/download/v$BBL_CLI_VERSION/bbl-v${BBL_CLI_VERSION}_linux_x86-64" --output /usr/local/bin/bbl && \
chmod +x /usr/local/bin/bbl
RUN curl -L https://github.com/cloudfoundry/bosh-cli/releases/download/v6.4.4/bosh-cli-6.4.4-linux-amd64 --output /usr/local/bin/bosh && \
RUN curl -L "https://github.com/cloudfoundry/bosh-cli/releases/download/v$BOSH_CLI_VERSION/bosh-cli-$BOSH_CLI_VERSION-linux-amd64" --output /usr/local/bin/bosh && \
chmod +x /usr/local/bin/bosh

View File

@@ -50,10 +50,14 @@ EOF
}
prepare_cf() {
local test_instances_org
test_instances_org="$DEFAULT_ORG-instances"
local -r test_instances_org="$DEFAULT_ORG-instances"
cf login -a "$API_HOST" -u "$USERNAME" -p "$PASSWORD" -o system --skip-ssl-validation "$SKIP_SSL_VALIDATION"
local skip_ssl_validation=""
if [ "$SKIP_SSL_VALIDATION" = "true" ]; then
skip_ssl_validation="--skip-ssl-validation"
fi
cf login -a "$API_HOST" -u "$USERNAME" -p "$PASSWORD" -o system "$skip_ssl_validation"
cf create-org "$DEFAULT_ORG"
cf create-space "$DEFAULT_SPACE" -o "$DEFAULT_ORG"

View File

@@ -1,4 +1,4 @@
version=1.6.0-SNAPSHOT
version=2.0.0-SNAPSHOT
group=org.springframework.cloud
onlyShowStandardStreamsOnTestFailure = false

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

275
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,101 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

14
gradlew.bat vendored
View File

@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal

View File

@@ -1,11 +1,25 @@
pluginManagement {
plugins {
id 'org.springframework.boot' version "2.7.5"
id "io.spring.nohttp" version "0.0.10"
id 'org.springframework.boot' version "3.0.0"
id 'org.asciidoctor.jvm.pdf' version '3.3.2'
id 'org.asciidoctor.jvm.convert' version '3.3.2'
}
repositories {
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositories {
mavenCentral()
maven { url "https://repo.spring.io/release" }
maven { url "https://plugins.gradle.org/m2/" }
if (version =~ /((-M|-RC)[0-9]+|-SNAPSHOT)$/) {
maven { url "https://repo.spring.io/milestone" }
}
if (version.endsWith('-SNAPSHOT')) {
maven { url "https://repo.spring.io/snapshot" }
}
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot'
}
@@ -21,7 +23,7 @@ plugins {
description = "Spring Cloud App Broker Acceptance Tests"
dependencies {
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api project(":spring-cloud-starter-app-broker-cloudfoundry")
api "org.springframework.boot:spring-boot-starter-webflux"

View File

@@ -30,8 +30,6 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import javax.net.ssl.SSLException;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
@@ -42,6 +40,7 @@ import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import com.jayway.jsonpath.spi.mapper.MappingProvider;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import javax.net.ssl.SSLException;
import org.cloudfoundry.operations.applications.ApplicationDetail;
import org.cloudfoundry.operations.applications.ApplicationEnvironments;
import org.cloudfoundry.operations.applications.ApplicationSummary;

View File

@@ -73,7 +73,7 @@ class UpdateInstanceAcceptanceTest extends CloudFoundryAcceptanceTest {
"spring.cloud.appbroker.services[0].apps[0].parameters-transformers[1].name=PropertyMapping",
"spring.cloud.appbroker.services[0].apps[0].parameters-transformers[1].args.include=count"
})
public void deployAppsOnUpdateService() {
void deployAppsOnUpdateService() {
// given a service instance is created
createServiceInstance(SI_NAME);

View File

@@ -16,10 +16,10 @@
package org.springframework.cloud.appbroker.acceptance.fixtures.cf;
import java.net.URI;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import java.net.URI;
import org.cloudfoundry.reactor.ProxyConfiguration;

View File

@@ -76,6 +76,10 @@ public class CloudFoundryService {
private static final String DEPLOYER_PROPERTY_PREFIX = "spring.cloud.appbroker.deployer.cloudfoundry.";
private static final String JBP_CONFIG_OPEN_JDK_JRE_ENV_VAR_NAME = "JBP_CONFIG_OPEN_JDK_JRE";
private static final String JBP_CONFIG_OPEN_JDK_JRE_17 = "{ jre: { version: 17.+ } }";
private static final int EXPECTED_PROPERTY_PARTS = 2;
private final CloudFoundryClient cloudFoundryClient;
@@ -445,6 +449,7 @@ public class CloudFoundryService {
private Map<String, String> appBrokerDeployerEnvironmentVariables(String brokerClientId) {
Map<String, String> deployerVariables = new HashMap<>();
deployerVariables.put(JBP_CONFIG_OPEN_JDK_JRE_ENV_VAR_NAME, JBP_CONFIG_OPEN_JDK_JRE_17);
deployerVariables.put(DEPLOYER_PROPERTY_PREFIX + "api-host",
cloudFoundryProperties.getApiHost());
deployerVariables.put(DEPLOYER_PROPERTY_PREFIX + "api-port",

View File

@@ -14,6 +14,12 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot' apply false
}
description = "Spring Cloud App Broker Autoconfiguration"
java {
@@ -23,11 +29,11 @@ java {
}
dependencies {
annotationProcessor platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
annotationProcessor platform(SpringBootPlugin.BOM_COORDINATES)
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor"
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api project(":spring-cloud-app-broker-core")
api project(":spring-cloud-app-broker-deployer")
api project(":spring-cloud-app-broker-deployer-cloudfoundry")

View File

@@ -1,6 +1,5 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.appbroker.autoconfigure.AppBrokerAutoConfiguration,\
org.springframework.cloud.appbroker.autoconfigure.CloudFoundryAppDeployerAutoConfiguration,\
org.springframework.cloud.appbroker.autoconfigure.CredHubAutoConfiguration,\
org.springframework.cloud.appbroker.autoconfigure.ServiceInstanceRecentLogsAutoConfiguration,\
org.springframework.cloud.appbroker.autoconfigure.AppBrokerAutoConfiguration
org.springframework.cloud.appbroker.autoconfigure.CloudFoundryAppDeployerAutoConfiguration
org.springframework.cloud.appbroker.autoconfigure.CredHubAutoConfiguration
org.springframework.cloud.appbroker.autoconfigure.ServiceInstanceRecentLogsAutoConfiguration
org.springframework.cloud.appbroker.autoconfigure.ServiceInstanceLogStreamAutoConfiguration

View File

@@ -1,3 +1,5 @@
import org.springframework.boot.gradle.plugin.SpringBootPlugin
/*
* Copyright 2002-2020 the original author or authors.
*
@@ -14,13 +16,17 @@
* limitations under the License.
*/
plugins {
id 'org.springframework.boot' apply false
}
description = "Spring Cloud App Broker Core"
dependencies {
api project(":spring-cloud-app-broker-deployer")
api "org.springframework.cloud:spring-cloud-open-service-broker-core:${openServiceBrokerVersion}"
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api "org.springframework:spring-core"
api "org.springframework:spring-context"
api "io.projectreactor:reactor-core"

View File

@@ -64,8 +64,7 @@ class InMemoryServiceInstanceStateRepositoryTest {
.assertNext(serviceInstanceState -> {
assertThat(serviceInstanceState.getOperationState()).isEqualTo(OperationState.IN_PROGRESS);
assertThat(serviceInstanceState.getDescription()).isEqualTo("bar");
assertThat(serviceInstanceState.getLastUpdated())
.isEqualToIgnoringSeconds(new Date());
assertThat(serviceInstanceState.getLastUpdated()).isInSameMinuteWindowAs(new Date());
})
.verifyComplete();

View File

@@ -14,10 +14,16 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot' apply false
}
description = "Spring Cloud App Broker Deployer Cloud Foundry"
dependencies {
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api project(":spring-cloud-app-broker-deployer")
api "org.cloudfoundry:cloudfoundry-client-reactor:${cfJavaClientVersion}"
api "org.cloudfoundry:cloudfoundry-operations:${cfJavaClientVersion}"

View File

@@ -506,7 +506,7 @@ class CloudFoundryAppDeployerTest {
void preUpdateAppUpdatesApplicationEnvironment() {
final String appId = "app-id";
given(operationsApplications.get(argThat(request -> request.getName().equals(APP_NAME))))
given(operationsApplications.get(argThat(request -> APP_NAME.equals(request.getName()))))
.willReturn(Mono.just(ApplicationDetail.builder()
.id(appId)
.name(APP_NAME)

View File

@@ -434,7 +434,7 @@ class CloudFoundryAppDeployerUpdateApplicationTest {
.verifyComplete();
then(applicationsV2).should().summary(SummaryApplicationRequest.builder().applicationId(APP_ID).build());
then(applicationsV2).should().update(argThat(arg -> arg.getApplicationId().equals(APP_ID)));
then(applicationsV2).should().update(argThat(arg -> APP_ID.equals(arg.getApplicationId())));
then(operationsServices).shouldHaveNoMoreInteractions();
then(applicationsV2).shouldHaveNoMoreInteractions();
}
@@ -465,7 +465,7 @@ class CloudFoundryAppDeployerUpdateApplicationTest {
then(operationsServices).should()
.bind(BindServiceInstanceRequest.builder().serviceInstanceName("service-2").applicationName(APP_NAME)
.build());
then(applicationsV2).should().update(argThat(arg -> arg.getApplicationId().equals(APP_ID)));
then(applicationsV2).should().update(argThat(arg -> APP_ID.equals(arg.getApplicationId())));
then(operationsServices).shouldHaveNoMoreInteractions();
then(applicationsV2).shouldHaveNoMoreInteractions();

View File

@@ -14,10 +14,16 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot' apply false
}
description = "Spring Cloud App Broker Deployer"
dependencies {
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api "org.springframework:spring-core"
api "io.projectreactor:reactor-core"

View File

@@ -14,9 +14,12 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.asciidoctor.jvm.pdf' version '3.3.2'
id 'org.asciidoctor.jvm.convert' version '3.3.2'
id 'org.springframework.boot' apply false
id 'org.asciidoctor.jvm.pdf'
id 'org.asciidoctor.jvm.convert'
}
description = "Spring Cloud App Broker Documentation"
@@ -26,7 +29,7 @@ configurations {
}
dependencies {
implementation platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
implementation platform(SpringBootPlugin.BOM_COORDINATES)
implementation project(":spring-cloud-app-broker-core")
implementation "org.springframework.boot:spring-boot-starter"
implementation "org.springframework.boot:spring-boot-starter-data-r2dbc"

View File

@@ -1,3 +1,5 @@
import org.springframework.boot.gradle.plugin.SpringBootPlugin
/*
* Copyright 2002-2020 the original author or authors.
*
@@ -21,13 +23,13 @@ plugins {
description = "Spring Cloud App Broker Integration Tests"
dependencies {
implementation platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
implementation platform(SpringBootPlugin.BOM_COORDINATES)
implementation project(":spring-cloud-starter-app-broker-cloudfoundry")
implementation "org.springframework.boot:spring-boot-starter-webflux"
testImplementation "org.springframework.boot:spring-boot-starter-test"
testImplementation "io.rest-assured:rest-assured"
testImplementation "com.github.tomakehurst:wiremock:${wiremockVersion}"
testImplementation "com.github.tomakehurst:wiremock-jre8-standalone:${wiremockVersion}"
}
test {

View File

@@ -16,13 +16,13 @@
package org.springframework.cloud.appbroker.integration.fixtures;
import jakarta.annotation.PostConstruct;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;

View File

@@ -14,10 +14,16 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot' apply false
}
description = "Spring Cloud App Broker Logging"
dependencies {
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api "org.springframework.boot:spring-boot-starter-webflux"
api "org.cloudfoundry:cloudfoundry-client-reactor:${cfJavaClientVersion}"
api "org.cloudfoundry:cloudfoundry-operations:${cfJavaClientVersion}"
@@ -25,7 +31,5 @@ dependencies {
testImplementation project(":spring-cloud-starter-app-broker-logging")
testImplementation "org.springframework.boot:spring-boot-starter-test"
testImplementation "org.junit.jupiter:junit-jupiter-api"
testImplementation "org.awaitility:awaitility:${awaitilityVersion}"
testImplementation "org.awaitility:awaitility"
}

View File

@@ -34,10 +34,10 @@ import org.springframework.context.event.EventListener;
})
public class LogStreamingTestApp {
static final String APP_ID = UUID.randomUUID().toString();
private static final String APP_ID = UUID.randomUUID().toString();
static boolean receivedStopEvent;
static String receivedStopEventServiceInstanceId;
private static boolean receivedStopEvent;
private static String receivedStopEventServiceInstanceId;
public static String getAppId() {
return APP_ID;

View File

@@ -14,10 +14,16 @@
* limitations under the License.
*/
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot' apply false
}
description = "Spring Cloud App Broker Security CredHub"
dependencies {
api platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
api platform(SpringBootPlugin.BOM_COORDINATES)
api project(":spring-cloud-app-broker-core")
api "org.springframework.credhub:spring-credhub-starter:${springCredhubVersion}"
api "org.springframework.cloud:spring-cloud-open-service-broker-core:${openServiceBrokerVersion}"

View File

@@ -95,7 +95,7 @@
<property name="processJavadoc" value="true" />
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck">
<property name="groups" value="java,javax,*,io.pivotal,org.springframework" />
<property name="groups" value="jakarta,java,*,io.pivotal,org.springframework" />
<property name="ordered" value="true" />
<property name="separated" value="true" />
<property name="option" value="bottom" />

View File

@@ -20,7 +20,9 @@
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>Main Ruleset</description>
<rule ref="category/java/bestpractices.xml" />
<rule ref="category/java/bestpractices.xml">
<exclude name="GuardLogStatement" />
</rule>
<rule ref="category/java/codestyle.xml">
<exclude name="AtLeastOneConstructor" />
<exclude name="LocalVariableCouldBeFinal" />
@@ -58,6 +60,7 @@
<exclude name="BeanMembersShouldSerialize" />
<exclude name="DataflowAnomalyAnalysis" />
<exclude name="InvalidLogMessageFormat" />
<exclude name="ReturnEmptyCollectionRatherThanNull" />
</rule>
<rule ref="category/java/multithreading.xml">
<exclude name="UseConcurrentHashMap" />