8 Commits

Author SHA1 Message Date
hlaeja
462a2ece96 [RELEASE] - Bump version 2025-07-29 18:22:20 +00:00
hlaeja
58ef553f29 [RELEASE] - Release version: 0.2.0 2025-07-29 18:22:19 +00:00
185d62c285 update gradlew 2025-07-29 20:21:37 +02:00
2ccb965b8e add GitHub action
- update release in README.md
- add action run checks
- add action release
- remove release.sh
2025-07-29 20:21:37 +02:00
e084394589 update project 2025-07-29 20:21:37 +02:00
a7a9e24f17 add actuator.http 2025-07-29 20:21:37 +02:00
fbde7db251 update cql files 2025-07-29 20:21:37 +02:00
7a3c338e2b [RELEASE] - bump version 2024-11-30 19:06:43 +01:00
19 changed files with 129 additions and 128 deletions

12
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
name: Release
on:
workflow_dispatch:
jobs:
release:
uses: swordsteel/hlaeja-common-workflows/.github/workflows/release.yml@master
secrets:
CI_BOT_PAT: ${{ secrets.CI_BOT_PAT }}
with:
TYPE: service

12
.github/workflows/run-checks.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
name: Pull request validation
on:
pull_request:
paths-ignore:
- '.github/**'
jobs:
validate:
uses: swordsteel/hlaeja-common-workflows/.github/workflows/run-checks.yml@master
secrets:
CI_BOT_PAT: ${{ secrets.CI_BOT_PAT }}

View File

@@ -19,7 +19,7 @@ Required: * can be stored as text, and ** need to be stored as secret.
## Releasing Service ## Releasing Service
Run `release.sh` script from `master` branch. Run release pipeline from `master` branch.
## Development ## Development

View File

@@ -1,9 +1,9 @@
plugins { plugins {
alias(hlaeja.plugins.kotlin.jvm) alias(hlaeja.plugins.kotlin.jvm)
alias(hlaeja.plugins.kotlin.spring) alias(hlaeja.plugins.kotlin.spring)
alias(hlaeja.plugins.ltd.hlaeja.plugin.service) alias(hlaeja.plugins.spring.boot)
alias(hlaeja.plugins.spring.dependency.management) alias(hlaeja.plugins.spring.dependency.management)
alias(hlaeja.plugins.springframework.boot) alias(hlaeja.plugins.service)
} }
dependencies { dependencies {
@@ -11,7 +11,7 @@ dependencies {
implementation(hlaeja.kotlin.logging) implementation(hlaeja.kotlin.logging)
implementation(hlaeja.kotlin.reflect) implementation(hlaeja.kotlin.reflect)
implementation(hlaeja.kotlinx.coroutines) implementation(hlaeja.kotlinx.coroutines)
implementation(hlaeja.library.hlaeja.common.messages) implementation(hlaeja.library.common.messages)
implementation(hlaeja.springboot.starter.actuator) implementation(hlaeja.springboot.starter.actuator)
implementation(hlaeja.springboot.starter.cassandra) implementation(hlaeja.springboot.starter.cassandra)
implementation(hlaeja.springboot.starter.cassandra.reactive) implementation(hlaeja.springboot.starter.cassandra.reactive)

View File

@@ -1,6 +1,63 @@
-- Create a keyspace -- Role: role_administrator
CREATE KEYSPACE IF NOT EXISTS device_configuration -- DROP ROLE role_administrator;
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}; CREATE ROLE role_administrator WITH LOGIN = false AND SUPERUSER = false;
-- Use the keyspace
USE device_configuration; -- Role: role_service
-- DROP ROLE role_service;
CREATE ROLE role_service WITH LOGIN = false AND SUPERUSER = false;
-- Role: role_maintainer
-- DROP ROLE role_maintainer;
CREATE ROLE role_maintainer WITH LOGIN = false AND SUPERUSER = false;
-- Role: role_support
-- DROP ROLE role_support;
CREATE ROLE role_support WITH LOGIN = false AND SUPERUSER = false;
-- Owner administrator
-- DROP ROLE administrator;
CREATE ROLE administrator WITH PASSWORD = 'password' AND LOGIN = true;
GRANT role_administrator TO administrator;
-- Owner service
-- DROP ROLE service;
CREATE ROLE service WITH PASSWORD = 'password' AND LOGIN = true;
GRANT role_service TO service;
-- Owner maintainer
-- DROP ROLE maintainer;
CREATE ROLE maintainer WITH PASSWORD = 'password' AND LOGIN = true;
GRANT role_maintainer TO maintainer;
-- Owner support
-- DROP ROLE support;
CREATE ROLE support WITH PASSWORD = 'password' AND LOGIN = true;
GRANT role_support TO support;
-- Keyspace
-- DROP KEYSPACE device_configuration;
CREATE KEYSPACE device_configuration
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}
AND durable_writes = true;
-- Revoke all permissions from existing roles
-- REVOKE ALL PERMISSIONS ON KEYSPACE device_configuration FROM role_administrator;
-- REVOKE ALL PERMISSIONS ON KEYSPACE device_configuration FROM role_service;
-- REVOKE ALL PERMISSIONS ON KEYSPACE device_configuration FROM role_maintainer;
-- REVOKE ALL PERMISSIONS ON KEYSPACE device_configuration FROM role_support;
-- Grant permissions
GRANT ALL PERMISSIONS ON KEYSPACE device_configuration TO role_administrator;
GRANT SELECT, MODIFY ON KEYSPACE device_configuration TO role_service;
GRANT SELECT, MODIFY ON KEYSPACE device_configuration TO role_maintainer;
GRANT SELECT ON KEYSPACE device_configuration TO role_support;

View File

@@ -1,4 +1,6 @@
-- Create a table -- Table: nodes
-- DROP TABLE IF EXISTS device_configuration.nodes;
CREATE TABLE IF NOT EXISTS device_configuration.nodes CREATE TABLE IF NOT EXISTS device_configuration.nodes
( (
id UUID PRIMARY KEY, id UUID PRIMARY KEY,

View File

@@ -1,4 +1,4 @@
kotlin.code.style=official kotlin.code.style=official
version=0.1.0 version=0.3.0-SNAPSHOT
catalog=0.5.0 catalog=0.11.0
container.port.host=9030 container.port.host=9030

Binary file not shown.

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

9
gradlew vendored
View File

@@ -86,8 +86,7 @@ done
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@@ -115,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@@ -206,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command: # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped. # and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line. # treated as '${Hostname}' itself on the command line.
@@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@" "$@"
# Stop when "xargs" is not available. # Stop when "xargs" is not available.

4
gradlew.bat vendored
View File

@@ -70,11 +70,11 @@ goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell

5
http/actuator.http Normal file
View File

@@ -0,0 +1,5 @@
### get actuator
GET {{hostname}}/actuator
### get actuator health
GET {{hostname}}/actuator/health

View File

@@ -1,89 +0,0 @@
#!/bin/sh
### This should be a pipeline, but for this example let use this ###
check_active_branch() {
if [ "$(git rev-parse --abbrev-ref HEAD)" != "$1" ]; then
echo "Error: The current branch is not $1."
exit 1
fi
}
check_uncommitted_changes() {
if [ -n "$(git status --porcelain)" ]; then
echo "Error: There are uncommitted changes in the repository."
exit 1
fi
}
prepare_environment() {
git fetch origin
}
check_last_commit() {
last_commit_message=$(git log -1 --pretty=format:%s)
if [ "$last_commit_message" = "[RELEASE] - bump version" ]; then
echo "Warning: Nothing to release!!!"
exit 1
fi
}
check_differences() {
if ! git diff --quiet origin/"$1" "$1"; then
echo "Error: The branches origin/$1 and $1 have differences."
exit 1
fi
}
un_snapshot_version() {
sed -i "s/\($1\s*=\s*[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/" gradle.properties
}
current_version() {
awk -F '=' '/version\s*=\s*[0-9.]*/ {gsub(/^ +| +$/,"",$2); print $2}' gradle.properties
}
stage_files() {
for file in "$@"; do
if git diff --exit-code --quiet -- "$file"; then
echo "No changes in $file"
else
git add "$file"
echo "Changes in $file staged for commit"
fi
done
}
commit_change() {
stage_files gradle.properties
git commit -m "[RELEASE] - $1"
git push --porcelain origin master
}
add_release_tag() {
gitTag="v$(current_version)"
git tag -a "$gitTag" -m "Release version $gitTag"
git push --porcelain origin "$gitTag"
}
snapshot_version() {
new_version="$(current_version | awk -F '.' '{print $1 "." $2+1 ".0"}')"
sed -i "s/\(version\s*=\s*\)[0-9.]*/\1$new_version-SNAPSHOT/" gradle.properties
}
# check and prepare for release
check_active_branch master
check_uncommitted_changes
prepare_environment
check_last_commit
check_differences master
# un-snapshot version for release
un_snapshot_version version
un_snapshot_version catalog
# release changes and prepare for next release
commit_change "release version: $(current_version)"
add_release_tag
snapshot_version
commit_change 'bump version'

View File

@@ -1,11 +1,11 @@
package ltd.hlaeja.controller package ltd.hlaeja.controller
import io.github.oshai.kotlinlogging.KotlinLogging
import java.util.UUID import java.util.UUID
import ltd.hlaeja.library.deviceConfiguration.Node import ltd.hlaeja.library.deviceConfiguration.Node
import ltd.hlaeja.service.NodeService import ltd.hlaeja.service.NodeService
import ltd.hlaeja.util.toEntity import ltd.hlaeja.util.toEntity
import ltd.hlaeja.util.toResponse import ltd.hlaeja.util.toResponse
import mu.KotlinLogging
import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.PutMapping
@@ -25,7 +25,7 @@ class NodeController(
@PathVariable node: UUID, @PathVariable node: UUID,
): Mono<Node.Response> = service.getConfiguration(node) ): Mono<Node.Response> = service.getConfiguration(node)
.map { it.toResponse() } .map { it.toResponse() }
.also { log.debug("Endpoint getNodeConfiguration for node: {}", node) } .also { log.debug { "Endpoint getNodeConfiguration for node: $node" } }
@PutMapping("/node-{node}") @PutMapping("/node-{node}")
fun updateNodeConfiguration( fun updateNodeConfiguration(
@@ -33,5 +33,5 @@ class NodeController(
@RequestBody nodeRequest: Node.Request, @RequestBody nodeRequest: Node.Request,
): Mono<Node.Response> = service.updateDevice(nodeRequest.toEntity(node)) ): Mono<Node.Response> = service.updateDevice(nodeRequest.toEntity(node))
.map { it.toResponse() } .map { it.toResponse() }
.also { log.debug("Endpoint updateNodeConfiguration for node: {}", node) } .also { log.debug { "Endpoint updateNodeConfiguration for node: $node" } }
} }

View File

@@ -1,13 +1,13 @@
package ltd.hlaeja.service package ltd.hlaeja.service
import io.github.oshai.kotlinlogging.KotlinLogging
import java.util.UUID import java.util.UUID
import ltd.hlaeja.entity.NodeEntity import ltd.hlaeja.entity.NodeEntity
import ltd.hlaeja.repository.NodeRepository import ltd.hlaeja.repository.NodeRepository
import mu.KotlinLogging
import org.springframework.stereotype.Service
import reactor.core.publisher.Mono
import org.springframework.http.HttpStatus.NOT_FOUND import org.springframework.http.HttpStatus.NOT_FOUND
import org.springframework.stereotype.Service
import org.springframework.web.server.ResponseStatusException import org.springframework.web.server.ResponseStatusException
import reactor.core.publisher.Mono
private val log = KotlinLogging.logger {} private val log = KotlinLogging.logger {}

View File

@@ -16,6 +16,20 @@ spring:
schema-action: none schema-action: none
local-datacenter: datacenter1 local-datacenter: datacenter1
management:
endpoints:
access:
default: none
web:
exposure:
include: "health,info"
endpoint:
health:
show-details: always
access: read_only
info:
access: read_only
--- ---
############################### ###############################
### Development environment ### ### Development environment ###

View File

@@ -1,11 +0,0 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
<logger level="DEBUG" name="ltd.hlaeja"/>
</configuration>

View File

@@ -1,9 +1,9 @@
package ltd.hlaeja package ltd.hlaeja
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest // import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest // @SpringBootTest
class ApplicationTests { class ApplicationTests {
@Test @Test