pcp-tgu
This commit is contained in:
+6
-6
@@ -16,12 +16,12 @@ allprojects {
|
||||
group = "space.nstart.pcp"
|
||||
ext.set("kotlinVersion", "2.2.20")
|
||||
repositories {
|
||||
maven {
|
||||
url = uri("https://repo.nstart.cloud/repository/maven-proxy/")
|
||||
}
|
||||
// mavenCentral()
|
||||
// mavenLocal()
|
||||
// gradlePluginPortal()
|
||||
// maven {
|
||||
// url = uri("https://repo.nstart.cloud/repository/maven-proxy/")
|
||||
// }
|
||||
mavenCentral()
|
||||
mavenLocal()
|
||||
gradlePluginPortal()
|
||||
maven { url = uri("https://jitpack.io") }
|
||||
|
||||
exclusiveContent {
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
# TODO before merge request: вернуть старые адреса окружения.
|
||||
# pcp.infra.postgres.host: 192.168.100.160
|
||||
# pcp.infra.postgres.host: 192.168.60.201
|
||||
pcp:
|
||||
infra:
|
||||
postgres:
|
||||
host: 192.168.100.160
|
||||
host: 192.168.60.201
|
||||
port: 35400
|
||||
kafka:
|
||||
host: 192.168.100.160
|
||||
host: 192.168.60.201
|
||||
port: 19092
|
||||
|
||||
network:
|
||||
host: 192.168.100.160
|
||||
host: 192.168.60.201
|
||||
|
||||
ports:
|
||||
config: 38888
|
||||
config: 8888
|
||||
admin: 38889
|
||||
route-processing: 8080
|
||||
request: 8080
|
||||
|
||||
@@ -56,7 +56,7 @@ spring:
|
||||
camunda:
|
||||
client:
|
||||
enabled: ${CAMUNDA_CLIENT_ENABLED:false}
|
||||
grpc-address: http://localhost:26500
|
||||
grpc-address: http://192.168.60.201:26500
|
||||
auth:
|
||||
method: none
|
||||
prefer-rest-over-grpc: false
|
||||
|
||||
@@ -3,19 +3,19 @@
|
||||
pcp:
|
||||
infra:
|
||||
postgres:
|
||||
host: ${PCP_POSTGRES_HOST:localhost}
|
||||
host: ${PCP_POSTGRES_HOST:192.168.60.201}
|
||||
port: ${PCP_POSTGRES_PORT:5432}
|
||||
kafka:
|
||||
host: ${PCP_KAFKA_HOST:localhost}
|
||||
host: ${PCP_KAFKA_HOST:192.168.60.201}
|
||||
port: ${PCP_KAFKA_PORT:29092}
|
||||
|
||||
|
||||
|
||||
network:
|
||||
host: ${PCP_NETWORK_HOST:localhost}
|
||||
host: ${PCP_NETWORK_HOST:192.168.60.201}
|
||||
|
||||
ports:
|
||||
config: 38888
|
||||
config: 8888
|
||||
admin: 7000
|
||||
route-processing: 7004
|
||||
request: 7005
|
||||
|
||||
@@ -75,7 +75,7 @@ spring:
|
||||
camunda:
|
||||
client:
|
||||
mode: self-managed
|
||||
grpc-address: http://camunda.k8s.265.nstart.local:30901
|
||||
grpc-address: http://192.168.60.201:26500
|
||||
auth:
|
||||
method: none
|
||||
prefer-rest-over-grpc: false
|
||||
@@ -136,7 +136,7 @@ spring:
|
||||
camunda:
|
||||
client:
|
||||
mode: self-managed
|
||||
grpc-address: http://camunda.k8s.265.nstart.local:30901
|
||||
grpc-address: http://192.168.60.201:26500
|
||||
auth:
|
||||
method: none
|
||||
prefer-rest-over-grpc: false
|
||||
|
||||
@@ -13,6 +13,7 @@ spring:
|
||||
client:
|
||||
instance:
|
||||
service-base-url: ${pcp.services.request}
|
||||
service-path: /swagger/ui
|
||||
management-base-url: ${pcp.services.request}
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
|
||||
@@ -11,6 +11,7 @@ spring:
|
||||
client:
|
||||
instance:
|
||||
service-base-url: ${pcp.services.route-processing}
|
||||
service-path: /swagger/ui
|
||||
management-base-url: ${pcp.services.route-processing}
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
|
||||
@@ -4,6 +4,7 @@ spring:
|
||||
client:
|
||||
instance:
|
||||
service-base-url: ${pcp.services.tgu}
|
||||
service-path: /swagger/ui
|
||||
management-base-url: ${pcp.services.tgu}
|
||||
flyway:
|
||||
enabled: true
|
||||
@@ -13,7 +14,6 @@ spring:
|
||||
camunda:
|
||||
client:
|
||||
mode: self-managed
|
||||
# grpc-address: http://camunda.k8s.265.nstart.local:30901
|
||||
grpc-address: http://192.168.60.201:26500
|
||||
auth:
|
||||
method: none
|
||||
@@ -25,6 +25,10 @@ management:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
|
||||
springdoc:
|
||||
swagger-ui:
|
||||
path: /swagger/ui
|
||||
|
||||
planning:
|
||||
notification-before-start-minutes: 263
|
||||
target-plan-duration-minutes: 180
|
||||
@@ -43,7 +47,7 @@ topics:
|
||||
|
||||
tgu:
|
||||
test-controller:
|
||||
enabled: false
|
||||
enabled: true
|
||||
|
||||
classifier:
|
||||
platforms-url: https://ordinis.nstart.cloud/api/v1/spacecraft/records
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -8,7 +8,7 @@ spring:
|
||||
jackson:
|
||||
default-property-inclusion: non_null
|
||||
kafka:
|
||||
bootstrap-servers: 192.168.60.68:29092
|
||||
bootstrap-servers: 192.168.1.8:29092
|
||||
consumer:
|
||||
group-id: pcp-ballistics-service
|
||||
auto-offset-reset: earliest
|
||||
@@ -16,7 +16,7 @@ spring:
|
||||
default-topic: pcp.tle
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: jdbc:postgresql://192.168.60.68:5432/pcp_ballistics
|
||||
url: jdbc:postgresql://192.168.1.8:5432/pcp_ballistics
|
||||
username: postgres
|
||||
password: password
|
||||
jpa:
|
||||
@@ -63,7 +63,7 @@ management:
|
||||
|
||||
settings:
|
||||
calculation-interval: 28
|
||||
ic-service: http://192.168.60.68:9080
|
||||
ic-service: http://192.168.1.8:9080
|
||||
|
||||
server:
|
||||
port: 7003
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
@@ -20,7 +20,7 @@ spring:
|
||||
on-profile: local
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: ${PCP_COMPLEX_MISSION_DATASOURCE_URL:jdbc:postgresql://${PCP_POSTGRES_HOST:localhost}:${PCP_POSTGRES_PORT:5432}/pcp_satellites}
|
||||
url: ${PCP_COMPLEX_MISSION_DATASOURCE_URL:jdbc:postgresql://${PCP_POSTGRES_HOST:192.168.60.201}:${PCP_POSTGRES_PORT:5432}/pcp_satellites}
|
||||
username: ${PCP_COMPLEX_MISSION_DATASOURCE_USERNAME:postgres}
|
||||
password: ${PCP_COMPLEX_MISSION_DATASOURCE_PASSWORD:password}
|
||||
jpa:
|
||||
@@ -46,7 +46,7 @@ spring:
|
||||
on-profile: dev
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: ${PCP_COMPLEX_MISSION_DATASOURCE_URL:jdbc:postgresql://192.168.100.160:35400/pcp_satellites}
|
||||
url: ${PCP_COMPLEX_MISSION_DATASOURCE_URL:jdbc:postgresql://192.168.60.201:35400/pcp_satellites}
|
||||
username: ${PCP_COMPLEX_MISSION_DATASOURCE_USERNAME:postgres}
|
||||
password: ${PCP_COMPLEX_MISSION_DATASOURCE_PASSWORD:password}
|
||||
jpa:
|
||||
|
||||
@@ -18,9 +18,9 @@ spring:
|
||||
|
||||
settings:
|
||||
calculation-interval: 3
|
||||
ballistics-service: http://localhost:7003
|
||||
earth-grid-service: http://localhost:7005
|
||||
complex-mission-service: http://localhost:7002
|
||||
stations-service: http://localhost:7009
|
||||
slots-service: http://localhost:7006
|
||||
coverage-scheme-service: http://localhost:7011
|
||||
ballistics-service: http://192.168.1.8:7003
|
||||
earth-grid-service: http://192.168.1.8:7005
|
||||
complex-mission-service: http://192.168.1.8:7002
|
||||
stations-service: http://192.168.1.8:7009
|
||||
slots-service: http://192.168.1.8:7006
|
||||
coverage-scheme-service: http://192.168.1.8:7011
|
||||
|
||||
+2
-2
@@ -4,8 +4,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
|
||||
@ConfigurationProperties("coverage-scheme")
|
||||
data class CoverageSchemeProperties(
|
||||
val ballisticsServiceUrl: String = "http://localhost:7003",
|
||||
val complexMissionServiceUrl: String = "http://localhost:7002",
|
||||
val ballisticsServiceUrl: String = "http://192.168.1.8:7003",
|
||||
val complexMissionServiceUrl: String = "http://192.168.1.8:7002",
|
||||
val satelliteCatalogServiceUrl: String = complexMissionServiceUrl,
|
||||
val defaultRollStepDegrees: Double = 5.0,
|
||||
val defaultMinimumTechnologyOverlap: Double = 0.05,
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.100.160:38888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:master}
|
||||
@@ -15,7 +15,7 @@ spring:
|
||||
# max-in-memory-size: 16MB
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: jdbc:postgresql://192.168.60.68:5432/complan
|
||||
url: jdbc:postgresql://192.168.1.8:5432/complan
|
||||
username: postgres
|
||||
password: password
|
||||
jpa:
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -23,7 +23,7 @@ camunda:
|
||||
enabled: false
|
||||
|
||||
settings:
|
||||
ballistics-service: http://localhost:7003
|
||||
complex-mission-service: http://localhost:7002
|
||||
satellite-catalog-service: http://localhost:7013
|
||||
stations-service: http://localhost:7009
|
||||
ballistics-service: http://192.168.1.8:7003
|
||||
complex-mission-service: http://192.168.1.8:7002
|
||||
satellite-catalog-service: http://192.168.1.8:7013
|
||||
stations-service: http://192.168.1.8:7009
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ class KafkaProducerConfig {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
fun requestProducerFactory(
|
||||
@Value("\${spring.kafka.bootstrap-servers:192.168.100.160:19092}") bootstrapServers: String,
|
||||
@Value("\${spring.kafka.bootstrap-servers:192.168.1.8:19092}") bootstrapServers: String,
|
||||
): ProducerFactory<String, String> {
|
||||
return DefaultKafkaProducerFactory(
|
||||
mapOf(
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:master}
|
||||
|
||||
@@ -13,7 +13,7 @@ spring:
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:master}
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: ${PCP_ROUTE_PROCESSING_DATASOURCE_URL:jdbc:postgresql://${PCP_POSTGRES_HOST:localhost}:${PCP_POSTGRES_PORT:5432}/pcp_route_processing}
|
||||
url: ${PCP_ROUTE_PROCESSING_DATASOURCE_URL:jdbc:postgresql://${PCP_POSTGRES_HOST:192.168.1.8}:${PCP_POSTGRES_PORT:5432}/pcp_route_processing}
|
||||
username: ${PCP_ROUTE_PROCESSING_DATASOURCE_USERNAME:postgres}
|
||||
password: ${PCP_ROUTE_PROCESSING_DATASOURCE_PASSWORD:password}
|
||||
jpa:
|
||||
|
||||
+11
-11
@@ -98,7 +98,7 @@
|
||||
],
|
||||
"assets": {
|
||||
"schema-calibration-vh": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/calibration-s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=26988c6a3490f71382ae9e61ff0d7b59aca32ec652993a785d24e8dd81e70939",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/calibration-s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=26988c6a3490f71382ae9e61ff0d7b59aca32ec652993a785d24e8dd81e70939",
|
||||
"title": "xml",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -107,7 +107,7 @@
|
||||
]
|
||||
},
|
||||
"schema-calibration-vv": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/calibration-s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=edd6957a0404ead07e7a31d0759db26b3a6ad33394247c177dc41a7abf5972d0",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/calibration-s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=edd6957a0404ead07e7a31d0759db26b3a6ad33394247c177dc41a7abf5972d0",
|
||||
"title": "xml",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -116,7 +116,7 @@
|
||||
]
|
||||
},
|
||||
"schema-noise-vh": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/noise-s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=3efe46114ed6dfeac898963510d3ba9c8b537c803b1fa69a5a03d5b462a1665c",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/noise-s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=3efe46114ed6dfeac898963510d3ba9c8b537c803b1fa69a5a03d5b462a1665c",
|
||||
"title": "xml",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -125,7 +125,7 @@
|
||||
]
|
||||
},
|
||||
"schema-noise-vv": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/noise-s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=0ca91479ba4132dbf13c2637f97567eb29ee9ca818009eaf501072995fe784ca",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/noise-s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120818Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=0ca91479ba4132dbf13c2637f97567eb29ee9ca818009eaf501072995fe784ca",
|
||||
"title": "xml",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -134,7 +134,7 @@
|
||||
]
|
||||
},
|
||||
"schema-product-vh": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120819Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=39817f0b7610c0b20a23d0fae24e7183f0d3719ba6ab2f315c320c9c6530274f",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120819Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=39817f0b7610c0b20a23d0fae24e7183f0d3719ba6ab2f315c320c9c6530274f",
|
||||
"title": "xml",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -143,7 +143,7 @@
|
||||
]
|
||||
},
|
||||
"schema-product-vv": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120819Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=85d28bc2bb94724b4db7df84121d4252b423fa429204e4b25e06b9d725f3aeee",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001.xml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120819Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=85d28bc2bb94724b4db7df84121d4252b423fa429204e4b25e06b9d725f3aeee",
|
||||
"title": "xml",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -152,7 +152,7 @@
|
||||
]
|
||||
},
|
||||
"safe-manifest": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/manifest.safe?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120819Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=dbb22d57d031a412e2b46273edf32cfcb7fbdae1fa1fcc74bdcaa39a5e086f53",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/manifest.safe?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120819Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=dbb22d57d031a412e2b46273edf32cfcb7fbdae1fa1fcc74bdcaa39a5e086f53",
|
||||
"title": "safe",
|
||||
"description": null,
|
||||
"type": "application/xml",
|
||||
@@ -161,7 +161,7 @@
|
||||
]
|
||||
},
|
||||
"vh": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002_cog.tif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120824Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=dbecc9e04e976751e855f53e9a9a8db5d6365a30ac7ec116f31b0936ee375648",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vh-20250625t013854-20250625t013919-059796-076d15-002_cog.tif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120824Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=dbecc9e04e976751e855f53e9a9a8db5d6365a30ac7ec116f31b0936ee375648",
|
||||
"title": "tif",
|
||||
"description": null,
|
||||
"type": "image/tiff; application=geotiff; profile=cloud-optimized",
|
||||
@@ -170,7 +170,7 @@
|
||||
]
|
||||
},
|
||||
"vv": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001_cog.tif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120829Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=34cf1e5f5174b7cb5ca5d173ff699923819d5df28486436d972efa59ac9b1ddb",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/s1a-iw-grd-vv-20250625t013854-20250625t013919-059796-076d15-001_cog.tif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120829Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=34cf1e5f5174b7cb5ca5d173ff699923819d5df28486436d972efa59ac9b1ddb",
|
||||
"title": "tif",
|
||||
"description": null,
|
||||
"type": "image/tiff; application=geotiff; profile=cloud-optimized",
|
||||
@@ -179,7 +179,7 @@
|
||||
]
|
||||
},
|
||||
"kml": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/map-overlay.kml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120829Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=92f63b9f463041c4ed87b3cb508ba8c57fd2db8ea2d22026087ba57d2ef88f54",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/map-overlay.kml?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120829Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=92f63b9f463041c4ed87b3cb508ba8c57fd2db8ea2d22026087ba57d2ef88f54",
|
||||
"title": "kml",
|
||||
"description": null,
|
||||
"type": "application/kml",
|
||||
@@ -188,7 +188,7 @@
|
||||
]
|
||||
},
|
||||
"thumbnail": {
|
||||
"href": "http://192.168.100.160:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/quick-look.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120829Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=19bebb1e446add1d6e0898b4329d2a3e016f59087719ce2b51dff5c487835cb0",
|
||||
"href": "http://192.168.1.8:9000/stac-data/S1A/S1A_IW_GRDH_1SDV_20250625T013854_20250625T013919_059796_076D15_B5C1.SAFE/quick-look.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20260331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260331T120829Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=19bebb1e446add1d6e0898b4329d2a3e016f59087719ce2b51dff5c487835cb0",
|
||||
"title": "png",
|
||||
"description": null,
|
||||
"type": "image/png",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:master}
|
||||
|
||||
File diff suppressed because one or more lines are too long
+13
-4
@@ -1,6 +1,7 @@
|
||||
package space.nstart.pcp_tgu_service.config
|
||||
|
||||
/** Настраивает Jackson-сериализацию для payload'ов клиента Camunda. */
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.fasterxml.jackson.databind.SerializationFeature
|
||||
import com.fasterxml.jackson.databind.json.JsonMapper
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
|
||||
@@ -13,15 +14,23 @@ import org.springframework.context.annotation.Configuration
|
||||
@Configuration
|
||||
class CamundaJacksonConfig {
|
||||
|
||||
/** Создаёт JSON mapper для Camunda с поддержкой Kotlin-классов и Java time типов. */
|
||||
@Bean("camundaJsonMapper")
|
||||
fun camundaJsonMapper(): CamundaJsonMapper {
|
||||
val objectMapper = JsonMapper.builder()
|
||||
/**
|
||||
* The service code still depends on Jackson 2 APIs, while the shared Boot 4 stack
|
||||
* auto-configures Jackson 3 for WebFlux. Keep a dedicated Jackson 2 mapper for
|
||||
* internal parsing and Camunda payloads until the module is migrated.
|
||||
*/
|
||||
@Bean
|
||||
fun objectMapper(): ObjectMapper {
|
||||
return JsonMapper.builder()
|
||||
.addModule(KotlinModule.Builder().build())
|
||||
.addModule(JavaTimeModule())
|
||||
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
|
||||
.build()
|
||||
}
|
||||
|
||||
/** Создаёт JSON mapper для Camunda с поддержкой Kotlin-классов и Java time типов. */
|
||||
@Bean("camundaJsonMapper")
|
||||
fun camundaJsonMapper(objectMapper: ObjectMapper): CamundaJsonMapper {
|
||||
return CamundaObjectMapper(objectMapper)
|
||||
}
|
||||
}
|
||||
|
||||
+37
@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import reactor.core.publisher.Mono
|
||||
import reactor.core.scheduler.Schedulers
|
||||
import space.nstart.pcp_tgu_service.domain.PlanDecision
|
||||
import space.nstart.pcp_tgu_service.dto.PlanDecisionMessage
|
||||
import space.nstart.pcp_tgu_service.dto.PlanResponse
|
||||
import space.nstart.pcp_tgu_service.dto.ProcessStartResponse
|
||||
@@ -19,8 +20,12 @@ import space.nstart.pcp_tgu_service.service.HandlePlanDecisionUseCase
|
||||
import space.nstart.pcp_tgu_service.service.IssueDuePlanWorker
|
||||
import space.nstart.pcp_tgu_service.service.PlanQueryService
|
||||
import space.nstart.pcp_tgu_service.service.PlanRecalculationJobService
|
||||
import space.nstart.pcp_tgu_service.service.PlatformService
|
||||
import space.nstart.pcp_tgu_service.service.RebuildPlanScheduleUseCase
|
||||
import space.nstart.pcp_tgu_service.service.TestPlanDecisionService
|
||||
import space.nstart.pcp_tgu_service.service.VisibilityRefreshJobService
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Path
|
||||
import java.time.LocalDateTime
|
||||
import java.util.UUID
|
||||
|
||||
@@ -36,7 +41,9 @@ class TestTguController(
|
||||
private val rebuildPlanScheduleUseCase: RebuildPlanScheduleUseCase,
|
||||
private val issueDuePlanWorker: IssueDuePlanWorker,
|
||||
private val handlePlanDecisionUseCase: HandlePlanDecisionUseCase,
|
||||
private val testPlanDecisionService: TestPlanDecisionService,
|
||||
private val externalPointsClient: ExternalPointsClient,
|
||||
private val platformService: PlatformService,
|
||||
private val planQueryService: PlanQueryService
|
||||
) {
|
||||
/** Ставит refresh job для КА. */
|
||||
@@ -71,6 +78,30 @@ class TestTguController(
|
||||
handlePlanDecisionUseCase.handle(message)
|
||||
}.subscribeOn(Schedulers.boundedElastic())
|
||||
|
||||
/** Генерирует ACCEPTED/REJECTED decision event для active attempt указанного persisted plan. */
|
||||
@PostMapping("/plans/{planId}/decision")
|
||||
fun generatePlanDecision(
|
||||
@PathVariable planId: UUID,
|
||||
@RequestParam decision: PlanDecision,
|
||||
@RequestParam(required = false) reason: String?
|
||||
): Mono<PlanDecisionMessage> =
|
||||
Mono.fromCallable {
|
||||
testPlanDecisionService.generateDecision(planId, decision, reason)
|
||||
}.subscribeOn(Schedulers.boundedElastic())
|
||||
|
||||
/** Загружает cache аппаратов из файла с root-array payload НСИ вместо запроса в НСИ. */
|
||||
@PostMapping("/platforms/load-from-file")
|
||||
fun loadPlatformsFromFile(@RequestParam("path") filePath: String): Mono<TestPlatformsLoadResponse> =
|
||||
Mono.fromCallable {
|
||||
val path = Path.of(filePath).toAbsolutePath().normalize()
|
||||
val platforms = platformService.loadPlatformsFromNsiPayload(Files.readString(path))
|
||||
TestPlatformsLoadResponse(
|
||||
filePath = path.toString(),
|
||||
loadedCount = platforms.size,
|
||||
allowedCount = platformService.loadAllowedPlatforms().size
|
||||
)
|
||||
}.subscribeOn(Schedulers.boundedElastic())
|
||||
|
||||
/** Загружает raw payload окон видимости из баллистики для диагностики. */
|
||||
@GetMapping("/external-points/{noradId}")
|
||||
fun getExternalPoints(
|
||||
@@ -93,3 +124,9 @@ class TestTguController(
|
||||
PlanResponse.from(planQueryService.getByPlanId(planId))
|
||||
}.subscribeOn(Schedulers.boundedElastic())
|
||||
}
|
||||
|
||||
data class TestPlatformsLoadResponse(
|
||||
val filePath: String,
|
||||
val loadedCount: Int,
|
||||
val allowedCount: Int
|
||||
)
|
||||
|
||||
+14
-1
@@ -1,6 +1,7 @@
|
||||
package space.nstart.pcp_tgu_service.service
|
||||
|
||||
/** Загружает метаданные платформ КА и применяет простую in-memory фильтрацию. */
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import space.nstart.pcp_tgu_service.config.ClassifierProperties
|
||||
import space.nstart.pcp_tgu_service.domain.PlatformCatalogItem
|
||||
import space.nstart.pcp_tgu_service.dto.NsiPlatformDto
|
||||
@@ -14,6 +15,7 @@ import java.time.Instant
|
||||
class PlatformService(
|
||||
private val platformsClassifierClient: PlatformsClassifierClient,
|
||||
private val classifierProperties: ClassifierProperties,
|
||||
private val objectMapper: ObjectMapper,
|
||||
private val clock: Clock = Clock.systemUTC()
|
||||
) {
|
||||
private val log = LoggerFactory.getLogger(javaClass)
|
||||
@@ -40,6 +42,13 @@ class PlatformService(
|
||||
now.isBefore(platform.validTo)
|
||||
}
|
||||
|
||||
/** Replaces the in-memory platform cache from a raw NSI response payload for test-only manual runs. */
|
||||
fun loadPlatformsFromNsiPayload(payloadJson: String): List<PlatformCatalogItem> =
|
||||
synchronized(cacheLock) {
|
||||
val platforms = objectMapper.readValue(payloadJson, Array<NsiPlatformDto>::class.java).toList()
|
||||
cachePlatforms(platforms, Instant.now(clock))
|
||||
}
|
||||
|
||||
private fun loadCachedPlatforms(): List<PlatformCatalogItem> {
|
||||
val now = Instant.now(clock)
|
||||
cachedPlatforms?.takeIf { cache -> cache.isActual(now) }?.let { cache -> return cache.platforms }
|
||||
@@ -54,7 +63,11 @@ class PlatformService(
|
||||
}
|
||||
|
||||
private fun fetchAndCachePlatforms(now: Instant): List<PlatformCatalogItem> {
|
||||
val platforms = platformsClassifierClient.fetchPlatforms()
|
||||
return cachePlatforms(platformsClassifierClient.fetchPlatforms(), now)
|
||||
}
|
||||
|
||||
private fun cachePlatforms(platformDtos: List<NsiPlatformDto>, now: Instant): List<PlatformCatalogItem> {
|
||||
val platforms = platformDtos
|
||||
.mapNotNull { platform -> platform.toCatalogItem() }
|
||||
|
||||
cachedPlatforms = PlatformsCache(
|
||||
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
package space.nstart.pcp_tgu_service.service
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
|
||||
import org.springframework.http.HttpStatus
|
||||
import org.springframework.stereotype.Service
|
||||
import org.springframework.web.server.ResponseStatusException
|
||||
import space.nstart.pcp_tgu_service.domain.PlanDecision
|
||||
import space.nstart.pcp_tgu_service.dto.PlanDecisionMessage
|
||||
import space.nstart.pcp_tgu_service.entity.PlanIssueAttemptStatus
|
||||
import space.nstart.pcp_tgu_service.repository.PlanIssueAttemptRepository
|
||||
import space.nstart.pcp_tgu_service.repository.PlannedPlanRepository
|
||||
import space.nstart.pcp_tgu_service.repository.SpacecraftPlanningStateJpaRepository
|
||||
import java.time.LocalDateTime
|
||||
import java.util.UUID
|
||||
|
||||
/**
|
||||
* Test-only helper: генерирует decision event для текущей active attempt persisted plan.
|
||||
*/
|
||||
@ConditionalOnProperty(prefix = "tgu.test-controller", name = ["enabled"], havingValue = "true")
|
||||
@Service
|
||||
class TestPlanDecisionService(
|
||||
private val plannedPlanRepository: PlannedPlanRepository,
|
||||
private val planIssueAttemptRepository: PlanIssueAttemptRepository,
|
||||
private val spacecraftPlanningStateJpaRepository: SpacecraftPlanningStateJpaRepository,
|
||||
private val handlePlanDecisionUseCase: HandlePlanDecisionUseCase
|
||||
) {
|
||||
/**
|
||||
* Создаёт synthetic decision event и проводит его через тот же use case, что Kafka consumer.
|
||||
*/
|
||||
fun generateDecision(planId: UUID, decision: PlanDecision, reason: String?): PlanDecisionMessage {
|
||||
val plan = plannedPlanRepository.findById(planId).orElse(null)
|
||||
?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Plan with planId=$planId was not found")
|
||||
val state = spacecraftPlanningStateJpaRepository.findById(plan.spacecraftId).orElse(null)
|
||||
?: throw ResponseStatusException(
|
||||
HttpStatus.CONFLICT,
|
||||
"Planning state for spacecraftId=${plan.spacecraftId} was not found"
|
||||
)
|
||||
if (state.activePlanId != planId || state.activeAttemptId == null) {
|
||||
throw ResponseStatusException(
|
||||
HttpStatus.CONFLICT,
|
||||
"Plan $planId is not the active plan waiting for decision"
|
||||
)
|
||||
}
|
||||
|
||||
val attempt = planIssueAttemptRepository.findById(state.activeAttemptId!!).orElse(null)
|
||||
?: throw ResponseStatusException(
|
||||
HttpStatus.CONFLICT,
|
||||
"Active attempt ${state.activeAttemptId} for plan $planId was not found"
|
||||
)
|
||||
if (attempt.planId != planId) {
|
||||
throw ResponseStatusException(
|
||||
HttpStatus.CONFLICT,
|
||||
"Active attempt ${attempt.attemptId} does not belong to plan $planId"
|
||||
)
|
||||
}
|
||||
if (attempt.status !in ACTIVE_ATTEMPT_STATUSES) {
|
||||
throw ResponseStatusException(
|
||||
HttpStatus.CONFLICT,
|
||||
"Attempt ${attempt.attemptId} is already terminal with status=${attempt.status}"
|
||||
)
|
||||
}
|
||||
|
||||
val message = PlanDecisionMessage(
|
||||
eventId = UUID.randomUUID(),
|
||||
spacecraftId = plan.spacecraftId,
|
||||
planId = plan.planId,
|
||||
attemptId = attempt.attemptId,
|
||||
decision = decision,
|
||||
decisionTime = LocalDateTime.now(),
|
||||
reason = reason?.takeIf { it.isNotBlank() } ?: DEFAULT_REASON
|
||||
)
|
||||
handlePlanDecisionUseCase.handle(message)
|
||||
return message
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val ACTIVE_ATTEMPT_STATUSES = setOf(PlanIssueAttemptStatus.STARTING, PlanIssueAttemptStatus.STARTED)
|
||||
const val DEFAULT_REASON = "TEST_CONTROLLER"
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:master}
|
||||
|
||||
+3
-1
@@ -1,5 +1,6 @@
|
||||
package space.nstart.pcp_tgu_service.integration.api
|
||||
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import com.sun.net.httpserver.HttpServer
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Test
|
||||
@@ -57,7 +58,8 @@ class ExternalPointsClientTest {
|
||||
platformsUrl = "http://localhost",
|
||||
platformsCacheTtl = java.time.Duration.ofMinutes(15),
|
||||
allowedPlatformStatuses = setOf("OPERATIONAL", "STANDBY")
|
||||
)
|
||||
),
|
||||
jacksonObjectMapper().findAndRegisterModules()
|
||||
) {
|
||||
override fun loadPlatforms(status: String?): List<PlatformCatalogItem> =
|
||||
error("ExternalPointsClient must use loadAllowedPlatforms")
|
||||
|
||||
+37
@@ -1,5 +1,6 @@
|
||||
package space.nstart.pcp_tgu_service.service
|
||||
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mockito.mock
|
||||
@@ -121,6 +122,41 @@ class PlatformServiceTest {
|
||||
verify(client, times(1)).fetchPlatforms()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `loadPlatformsFromNsiPayload replaces cached platforms from file payload`() {
|
||||
val client = mock(PlatformsClassifierClient::class.java)
|
||||
`when`(client.fetchPlatforms()).thenReturn(
|
||||
listOf(platformDto(id = "from-nsi-id", status = "OPERATIONAL", noradId = 1L))
|
||||
)
|
||||
val service = service(client)
|
||||
|
||||
val fromNsi = service.loadPlatforms()
|
||||
val fromFile = service.loadPlatformsFromNsiPayload(
|
||||
"""
|
||||
[
|
||||
{
|
||||
"id": "from-file-id",
|
||||
"businessKey": "business-from-file-id",
|
||||
"data": {
|
||||
"name": "Satellite from-file-id",
|
||||
"status": "OPERATIONAL",
|
||||
"norad_id": 25544,
|
||||
"mission": "MISSION"
|
||||
},
|
||||
"validFrom": "2026-01-01T00:00:00Z",
|
||||
"validTo": "2026-12-31T00:00:00Z"
|
||||
}
|
||||
]
|
||||
""".trimIndent()
|
||||
)
|
||||
val cachedAfterFileLoad = service.loadPlatforms()
|
||||
|
||||
assertEquals(listOf("from-nsi-id"), fromNsi.map { it.nsiId })
|
||||
assertEquals(listOf("from-file-id"), fromFile.map { it.nsiId })
|
||||
assertEquals(listOf("from-file-id"), cachedAfterFileLoad.map { it.nsiId })
|
||||
verify(client, times(1)).fetchPlatforms()
|
||||
}
|
||||
|
||||
private fun service(
|
||||
client: PlatformsClassifierClient,
|
||||
clock: Clock = Clock.fixed(Instant.parse("2026-05-26T12:00:00Z"), ZoneOffset.UTC)
|
||||
@@ -132,6 +168,7 @@ class PlatformServiceTest {
|
||||
platformsCacheTtl = Duration.ofMinutes(15),
|
||||
allowedPlatformStatuses = setOf("OPERATIONAL")
|
||||
),
|
||||
objectMapper = jacksonObjectMapper().findAndRegisterModules(),
|
||||
clock = clock
|
||||
)
|
||||
|
||||
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
package space.nstart.pcp_tgu_service.service
|
||||
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertNotNull
|
||||
import org.junit.jupiter.api.Assertions.assertThrows
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mockito.mock
|
||||
import org.mockito.Mockito.verify
|
||||
import org.mockito.Mockito.verifyNoInteractions
|
||||
import org.mockito.Mockito.`when`
|
||||
import org.springframework.http.HttpStatus
|
||||
import org.springframework.web.server.ResponseStatusException
|
||||
import space.nstart.pcp_tgu_service.domain.PlanDecision
|
||||
import space.nstart.pcp_tgu_service.dto.PlanDecisionMessage
|
||||
import space.nstart.pcp_tgu_service.entity.PlanIssueAttemptEntity
|
||||
import space.nstart.pcp_tgu_service.entity.PlanIssueAttemptStatus
|
||||
import space.nstart.pcp_tgu_service.entity.PlannedPlanEntity
|
||||
import space.nstart.pcp_tgu_service.entity.PlannedPlanStatus
|
||||
import space.nstart.pcp_tgu_service.entity.SpacecraftPlanningStateEntity
|
||||
import space.nstart.pcp_tgu_service.repository.PlanIssueAttemptRepository
|
||||
import space.nstart.pcp_tgu_service.repository.PlannedPlanRepository
|
||||
import space.nstart.pcp_tgu_service.repository.SpacecraftPlanningStateJpaRepository
|
||||
import java.time.LocalDateTime
|
||||
import java.util.Optional
|
||||
import java.util.UUID
|
||||
|
||||
class TestPlanDecisionServiceTest {
|
||||
|
||||
@Test
|
||||
fun `generate decision builds message for active attempt and delegates to use case`() {
|
||||
val plan = plannedPlan()
|
||||
val attempt = attempt(plan.planId, PlanIssueAttemptStatus.STARTED)
|
||||
val state = SpacecraftPlanningStateEntity(
|
||||
spacecraftId = plan.spacecraftId,
|
||||
activePlanId = plan.planId,
|
||||
activeAttemptId = attempt.attemptId
|
||||
)
|
||||
val handlePlanDecisionUseCase = mock(HandlePlanDecisionUseCase::class.java)
|
||||
val service = service(plan, attempt, state, handlePlanDecisionUseCase)
|
||||
|
||||
val message = service.generateDecision(plan.planId, PlanDecision.ACCEPTED, "manual accept")
|
||||
|
||||
assertNotNull(message.eventId)
|
||||
assertEquals(plan.spacecraftId, message.spacecraftId)
|
||||
assertEquals(plan.planId, message.planId)
|
||||
assertEquals(attempt.attemptId, message.attemptId)
|
||||
assertEquals(PlanDecision.ACCEPTED, message.decision)
|
||||
assertEquals("manual accept", message.reason)
|
||||
verify(handlePlanDecisionUseCase).handle(message)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `generate decision rejects plan without active attempt`() {
|
||||
val plan = plannedPlan()
|
||||
val attempt = attempt(plan.planId, PlanIssueAttemptStatus.STARTED)
|
||||
val state = SpacecraftPlanningStateEntity(spacecraftId = plan.spacecraftId)
|
||||
val handlePlanDecisionUseCase = mock(HandlePlanDecisionUseCase::class.java)
|
||||
val service = service(plan, attempt, state, handlePlanDecisionUseCase)
|
||||
|
||||
val exception = assertThrows(ResponseStatusException::class.java) {
|
||||
service.generateDecision(plan.planId, PlanDecision.REJECTED, null)
|
||||
}
|
||||
|
||||
assertEquals(HttpStatus.CONFLICT, exception.statusCode)
|
||||
verifyNoInteractions(handlePlanDecisionUseCase)
|
||||
}
|
||||
|
||||
private fun service(
|
||||
plan: PlannedPlanEntity,
|
||||
attempt: PlanIssueAttemptEntity,
|
||||
state: SpacecraftPlanningStateEntity,
|
||||
handlePlanDecisionUseCase: HandlePlanDecisionUseCase
|
||||
): TestPlanDecisionService {
|
||||
val plannedPlanRepository = mock(PlannedPlanRepository::class.java)
|
||||
val planIssueAttemptRepository = mock(PlanIssueAttemptRepository::class.java)
|
||||
val stateRepository = mock(SpacecraftPlanningStateJpaRepository::class.java)
|
||||
|
||||
`when`(plannedPlanRepository.findById(plan.planId)).thenReturn(Optional.of(plan))
|
||||
`when`(planIssueAttemptRepository.findById(attempt.attemptId)).thenReturn(Optional.of(attempt))
|
||||
`when`(stateRepository.findById(plan.spacecraftId)).thenReturn(Optional.of(state))
|
||||
|
||||
return TestPlanDecisionService(
|
||||
plannedPlanRepository = plannedPlanRepository,
|
||||
planIssueAttemptRepository = planIssueAttemptRepository,
|
||||
spacecraftPlanningStateJpaRepository = stateRepository,
|
||||
handlePlanDecisionUseCase = handlePlanDecisionUseCase
|
||||
)
|
||||
}
|
||||
|
||||
private fun plannedPlan(): PlannedPlanEntity =
|
||||
PlannedPlanEntity(
|
||||
planId = UUID.randomUUID(),
|
||||
spacecraftId = "25544",
|
||||
startTime = LocalDateTime.now().plusHours(1),
|
||||
endTime = LocalDateTime.now().plusHours(2),
|
||||
kppId = "KPP-1",
|
||||
status = PlannedPlanStatus.WAITING_DECISION
|
||||
)
|
||||
|
||||
private fun attempt(planId: UUID, status: PlanIssueAttemptStatus): PlanIssueAttemptEntity =
|
||||
PlanIssueAttemptEntity(
|
||||
attemptId = UUID.randomUUID(),
|
||||
planId = planId,
|
||||
attemptNo = 1,
|
||||
status = status
|
||||
)
|
||||
}
|
||||
+3
-3
@@ -48,8 +48,8 @@ class WebConfig : WebMvcConfigurer {
|
||||
.allowedOrigins(
|
||||
"http://localhost:3000",
|
||||
"http://localhost:8080",
|
||||
"http://192.168.60.68:7008",
|
||||
"http://192.168.60.68:8080"
|
||||
"http://192.168.1.8:7008",
|
||||
"http://192.168.1.8:8080"
|
||||
)
|
||||
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
|
||||
.allowedHeaders("*")
|
||||
@@ -66,7 +66,7 @@ class WebConfig : WebMvcConfigurer {
|
||||
// Разрешенные origin'ы
|
||||
allowedOriginPatterns = listOf(
|
||||
"http://localhost:*",
|
||||
"http://192.168.60.68:*"
|
||||
"http://192.168.1.8:*"
|
||||
)
|
||||
// Разрешенные заголовки
|
||||
allowedHeaders = listOf(
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -9,7 +9,7 @@ spring:
|
||||
default-property-inclusion: non_null
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: jdbc:postgresql://192.168.100.160:35400/pcp_slots
|
||||
url: jdbc:postgresql://192.168.1.8:35400/pcp_slots
|
||||
username: postgres
|
||||
password: password
|
||||
hikari:
|
||||
@@ -59,7 +59,7 @@ management:
|
||||
enabled: true
|
||||
|
||||
settings:
|
||||
earth-grid-service: http://192.168.60.68:7005
|
||||
earth-grid-service: http://192.168.1.8:7005
|
||||
|
||||
server:
|
||||
port: 7006
|
||||
|
||||
@@ -7,7 +7,7 @@ spring:
|
||||
import: "configserver:"
|
||||
cloud:
|
||||
config:
|
||||
uri: ${CONFIG_SERVER_URI:http://localhost:8888}
|
||||
uri: ${CONFIG_SERVER_URI:http://192.168.60.201:8888}
|
||||
fail-fast: ${CONFIG_SERVER_FAIL_FAST:true}
|
||||
profile: ${SPRING_CLOUD_CONFIG_PROFILE:${SPRING_PROFILES_ACTIVE:${spring.profiles.default}}}
|
||||
label: ${SPRING_CLOUD_CONFIG_LABEL:dev}
|
||||
|
||||
@@ -5,7 +5,7 @@ spring:
|
||||
config:
|
||||
enabled: false
|
||||
kafka:
|
||||
bootstrap-servers: 192.168.60.68:29092
|
||||
bootstrap-servers: 192.168.1.8:29092
|
||||
consumer:
|
||||
group-id: pcp
|
||||
auto-offset-reset: earliest
|
||||
@@ -13,7 +13,7 @@ spring:
|
||||
default-topic: pcp.tle
|
||||
datasource:
|
||||
driver-class-name: org.postgresql.Driver
|
||||
url: jdbc:postgresql://192.168.60.68:5432/pcp_tle
|
||||
url: jdbc:postgresql://192.168.1.8:5432/pcp_tle
|
||||
username: postgres
|
||||
password: password
|
||||
jpa:
|
||||
@@ -62,7 +62,7 @@ management:
|
||||
enabled: true
|
||||
|
||||
settings:
|
||||
complex-mission-service: http://192.168.60.68:7002
|
||||
complex-mission-service: http://192.168.1.8:7002
|
||||
|
||||
tle:
|
||||
polling:
|
||||
|
||||
Reference in New Issue
Block a user