Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/dockerhub images release #228

Closed
wants to merge 83 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
cad2ae0
feat(Gate-Pool): Add workflow to push images to dockerhub
fabiodmota May 30, 2023
df7ef87
feat(Gate-Pool): Add trigger from branch
fabiodmota May 31, 2023
632ebbf
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 1, 2023
50f3598
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 1, 2023
f23c735
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
03b4b74
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
19925a1
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
be12aca
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
299a0e9
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
71cd0cc
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
5144d71
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
175e3f5
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
768c745
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 2, 2023
426e54a
feat(api): #179 Pool API: Legal Entity Response should include Legal…
rainer-exxcellent May 31, 2023
9556137
feat(api): #179 Pool API: Legal Entity Response should fix after merge
rainer-exxcellent Jun 1, 2023
d95a2dc
feat(api): #179 Pool API: Legal Entity Response should include Legal…
rainer-exxcellent Jun 1, 2023
19371ff
feat(api): #202 API: Delivery Service Qualifier in Alternative Postal…
rainer-exxcellent Jun 1, 2023
8d1bdc4
feat(api): #183 Gate API: Add Street Name Suffix and Prefix Fields
rainer-exxcellent Jun 1, 2023
71a87cc
feat(api): #183 Gate API: Add Street Name Suffix and Prefix Fields
rainer-exxcellent Jun 1, 2023
fbef164
feat(api): #183 Gate API: Add Street Name Suffix and Prefix Fields
rainer-exxcellent Jun 1, 2023
8671391
feat(api): #183 Gate API: Add Street Name Suffix and Prefix Fields
rainer-exxcellent Jun 2, 2023
f678229
feat(api): #216 Remove suggestion endpoints
rainer-exxcellent Jun 5, 2023
948b9de
feat(api): #216 Remove suggestion endpoints - delete unused constants
rainer-exxcellent Jun 5, 2023
dd51459
feat(api): #216 Remove suggestion endpoints - delete unused vals
rainer-exxcellent Jun 5, 2023
73073f3
fix(api): #222 Wrong Schema for Entities with Error Response
rainer-exxcellent Jun 6, 2023
3f45396
fix(gate/pool): Changed information from Install.md and aplication pr…
cezaralexandremorais Jun 2, 2023
b18a459
fix(gate/pool) updated some default values for SaaS in proprieties fi…
cezaralexandremorais Jun 5, 2023
685a3bc
fix(gate) updated INSTALL.md file with information about how to run t…
cezaralexandremorais Jun 6, 2023
68708e9
fix(gate) Removed BPN property from LogisticAddress , LegalEntity and…
cezaralexandremorais Jun 6, 2023
29fcd36
fix(gate) added bpn property to Site, LegalEntity and LogisticAddress…
cezaralexandremorais Jun 6, 2023
fef8347
feat(Pool): Rebase and Update api for searching on legal and address …
fabiodmota Jun 6, 2023
853a289
feat(Gate): remove type-matching endpoints and logic
nicoprow Jun 5, 2023
85c7186
fix(api): #233 Site Response should include Main Address #233
rainer-exxcellent Jun 6, 2023
8b93531
fix(api): #233 Site Response should include Main Address #233
rainer-exxcellent Jun 7, 2023
1ec40f8
feat(Gate): remove validation endpoints and logic
nicoprow Jun 5, 2023
a16f8f6
feat(gate): Added new Output PUT endpoint, changed logic for Output F…
alexsilva-CGI Jun 1, 2023
a1f10f9
feat(gate): Added new Output PUT endpoint (Sites/LegalEntity), added …
alexsilva-CGI Jun 2, 2023
8188648
feat(gate): Changed Search Output logic on site/legalEntity
alexsilva-CGI Jun 5, 2023
40a69a9
feat(gate): Added verification on persistence upon saving output data…
alexsilva-CGI Jun 5, 2023
7930152
feat(gate): Changed migration logic to account with database data, Fi…
alexsilva-CGI Jun 6, 2023
cea0ce8
feat(gate): Removed ProcessStartedAt field, changed Response from inp…
alexsilva-CGI Jun 7, 2023
67fe305
feat(gate): Unit tests fix according to the removal of BPNs, fix migr…
alexsilva-CGI Jun 7, 2023
2e3336c
fix(Gate): business partner output response DTOs
nicoprow Jun 9, 2023
d0c36f9
fix(api): #237 Remove Field ProcessStartedAt
rainer-exxcellent Jun 7, 2023
65354d2
feat(Gate): merge changelog query endpoints
nicoprow Jun 5, 2023
406a50a
feat(Gate-API): add endpoint for output changelogs
nicoprow Jun 9, 2023
d28cdda
feat(Pool): add LSA type filter to changelog endpoint
nicoprow Jun 6, 2023
c2dff90
feat(Pool): remove business partner legacy endpoints and logic
nicoprow Jun 7, 2023
f31ccd7
feat(Gate): replace name with name parts collection in logistic address
nicoprow Jun 9, 2023
031a645
feat(Gate): replace name with name parts collection in site DTO
nicoprow Jun 9, 2023
3972c51
fix(Gate): response and request DTO information for legal/main address
nicoprow Jun 9, 2023
3839aa3
feat(Gate): add business partner roles to DTOs
nicoprow Jun 9, 2023
4426869
cicd(Helm): increase the app version to 4.0.0-alpha.5
nicoprow Jun 9, 2023
3fee413
fix(Bridge): error on business partner sync with empty name parts
nicoprow Jun 9, 2023
a710b5f
fix(Gate): add missing legal name parts to DTOs and fix mapping logic
nicoprow Jun 9, 2023
55d0580
cicd(Helm): increase app version to 4.0.0-alpha.6
nicoprow Jun 9, 2023
19f59e4
fix(gate): Added changelog to Logistic Address when Legal Entity or S…
alexsilva-CGI Jun 14, 2023
70bef1c
fix(Gate-Bridge): Replace Array with Collection Type #263
fabiodmota Jun 14, 2023
aa8cdfe
Fix(Pool): Docs Update README to include Docker Compose setup instruc…
fabiodmota Jun 15, 2023
6d40d67
feat: added maven wrapper for windows.
cezaralexandremorais Jun 13, 2023
14fcb28
Docs: Update yaml and json files for gate, pool and bridge dummy serv…
SujitMBRDI Jun 15, 2023
26c3b1b
fix(gate): Removal of unused columns in the persistence
alexsilva-CGI Jun 15, 2023
0b6c481
fix(gate): Removal of Region Table
alexsilva-CGI Jun 16, 2023
8770559
fix(gate): Removal of Identifier Entities and Unit test fix
alexsilva-CGI Jun 20, 2023
0893f74
fix(gate): fix migration file versioning
alexsilva-CGI Jun 22, 2023
7009738
API-Model: Update postman collection with new data model #288
SujitMBRDI Jun 15, 2023
b5e79e2
Removed protocol and updated changes on review comments
SujitMBRDI Jun 23, 2023
004aa3f
Feat(Gate): Add dataType column to ChangelogEntry entity
fabiodmota Jun 16, 2023
5f7163c
Feat(Gate): Add logic to create changelog from Output Changes
fabiodmota Jun 22, 2023
5fa6dae
Feat(Bridge): Configured Spring Security to use roles from JWT for AP…
fabiodmota Jun 20, 2023
6faf53c
Feat(Bridge-Common): Configured Spring Security to use roles from JWT…
fabiodmota Jun 22, 2023
3319d88
Feat(Bridge): Remove unnecessary value from controller
fabiodmota Jun 23, 2023
2b32254
Feat(Gate): Configured Spring Security to use roles from JWT for API …
fabiodmota Jun 22, 2023
085cd4b
Feat(Gate-Common): Configured Spring Security to use roles from JWT o…
fabiodmota Jun 22, 2023
7161097
fix(gate): Removal Unused fields in entities, added alt_delivery_serv…
alexsilva-CGI Jun 21, 2023
1818669
fix(gate): Removal of address on AlternativePostalAddress.kt on Pool,…
alexsilva-CGI Jun 23, 2023
ef361e0
fix(gate): Migration files name refactoring
alexsilva-CGI Jun 23, 2023
7346453
fix(gate): deliveryServiceQualifier fix to allow null values
alexsilva-CGI Jun 23, 2023
5928af8
fix(gate): deliveryServiceQualifier fix to allow null values
alexsilva-CGI Jun 23, 2023
81bafa4
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota May 30, 2023
06826c5
fix(Bridge): Try to fix deploy on ghcr registry and docker hub
fabiodmota Jun 7, 2023
d13b318
Feat(Pool-Gate-Bridge): Rework the notice md docker for each project
fabiodmota Jun 23, 2023
cff18de
feat(Pool-Gate-Bridge): Fix workflow for publishing docker images
fabiodmota Jun 26, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/build-docker-all.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,23 @@ on:
jobs:
build-docker-pool:
uses: ./.github/workflows/build-docker.yaml
secrets: inherit
with:
imageName: pool
dockerfilePath: ./bpdm-pool/Dockerfile
push: ${{ github.event_name != 'pull_request' }}

build-docker-gate:
uses: ./.github/workflows/build-docker.yaml
secrets: inherit
with:
imageName: gate
dockerfilePath: ./bpdm-gate/Dockerfile
push: ${{ github.event_name != 'pull_request' }}

build-docker-bridge-dummy:
uses: ./.github/workflows/build-docker.yaml
secrets: inherit
with:
imageName: bridge-dummy
dockerfilePath: ./bpdm-bridge-dummy/Dockerfile
Expand Down
41 changes: 28 additions & 13 deletions .github/workflows/build-docker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ on:


env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}/${{ inputs.imageName }}
IMAGE_NAMESPACE: "tractusx"
IMAGE_NAME: ${{ inputs.imageName }}

jobs:
build-docker:
docker:
runs-on: ubuntu-latest
permissions:
packages: write

steps:
- name: Checkout
uses: actions/checkout@v3
Expand All @@ -37,27 +37,42 @@ jobs:
uses: docker/metadata-action@v4
with:
images: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
${{ env.IMAGE_NAMESPACE }}/${{ env.IMAGE_NAME }}
# Automatically prepare image tags; See action docs for more examples.
# semver patter will generate tags like these for example :1 :1.2 :1.2.3
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}
type=semver,pattern={{major}}.{{minor}}

- name: Log into registry ${{ env.REGISTRY }}
- name: DockerHub login
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Use existing DockerHub credentials present as secrets
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}

- name: Build and push
uses: docker/build-push-action@v3
with:
context: .
push: ${{ inputs.push }}
file: ${{ inputs.dockerfilePath }}
# Build image for verification purposes on every trigger event. Only push if event is not a PR
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
labels: ${{ steps.meta.outputs.labels }}

# https://github.com/peter-evans/dockerhub-description
# Important step to push image description to DockerHub
- name: Update Docker Hub description
if: github.event_name != 'pull_request'
uses: peter-evans/dockerhub-description@v3
with:
# readme-filepath defaults to toplevel README.md, Only necessary if you have a dedicated file with your 'Notice for docker images'
# readme-filepath: path/to/dedicated/notice-for-docker-image.md
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
repository: ${{ env.IMAGE_NAMESPACE }}/${{ env.IMAGE_NAME }}
readme-filepath: "DOCKER_NOTICE.md"
42 changes: 17 additions & 25 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,31 @@ This file contains information on how to configure and run the BPDM applications

BPDM Pool is a SpringBoot Kotlin software project managed by Maven.

The project can be run with the following command: `mvn clean spring-boot:run`
To run the project first you need to install it from the parent pom, go to the root folder and run `mvn clean install`

Then depending on which module you want to start go to the module subfolder you like to run and use the following command: `mvn spring-boot:run`

### Prerequisites

* Maven
* JDK17
* PostgreSQL 14.2
* OpenSearch 2.1.0
* Docker and Docker Compose
* Keycloak 17.0.0 (with enabled `auth` profile)
* Connection to an SaaS for the sharing process (with enabled `saas` profile)

When running, the project requires a Postgresql database and an Opensearch instance to be available to connect to.
When running, the project requires a PostgreSQL database and an OpenSearch instance to be available to connect to. You can set up these dependencies manually, or you can use the provided `docker-compose` file which will start the necessary dependencies for you.

To use Docker Compose, navigate to the project directory and run the following command:
```bash
docker-compose up
```

Per default configuration the application expects postgres to run on `localhost` on port `5432`.
Opensearch needs to run on `localhost` on port `9200` on default.

You can find and edit the default configuration for the Pool in the `application.properties`, `application-auth.properties` and `application-saas.properties`
You can find and edit the default configuration for the Pool in the `application.properties`, `application-auth.properties`
files in the `resources` folder.

The REST API documentation can be accessed at http://localhost:8080/api/swagger-ui.
The REST API documentation can be accessed at http://localhost:8080/ui/swagger-ui/index.html.

### Profiles

Expand All @@ -33,11 +39,10 @@ Here you can find core application configuration such as Swagger documentation,
Furthermore, here you can find the configuration for the connection to the Spring datasource (currently, developed against PostgreSQL) and Opensearch.

You can also run the project with Spring profiles to enable additional components on top of the default configuration.
Currently, the BPDM Pool offers the profiles `auth` and `saas`.
Currently, the BPDM Pool offers the profile `auth`.
In order to run the application with a specific profile you can use the appropriate maven flag `Dspring.profiles.active`.

For example, the command `mvn clean spring-boot:run -Dspring.profiles.active=auth` starts the application with additional `auth` configuration enabled.
You can also run several profiles at once, of course: `mvn clean spring-boot:run -Dspring.profiles.active=auth,saas`.

The following sections detail the configuration properties for each profile.

Expand All @@ -50,23 +55,14 @@ The application uses the configured auth server URL to validate incoming tokens.

For authorization purposes the application checks incoming token's permissions:

* add_company_data: For endpoints creating or updating business partner records including triggering imports from SaaS/exports to Opensearch
* add_company_data: For endpoints creating or updating business partner records
* view_company_data: For read-only endpoints of business partner data

The BPDM Pool looks for these permissions in the client/resource and not on the realm level.

This profile also enables/disables the login form in the auto-generated Swagger documentation.
The Swagger login uses the client specified in the property `springdoc.swagger-ui.oauth.client-id`.

### SaaS

The file `application-saas.properties` enables and configures the connection to a remote SaaS for the sharing process from which the application can import
business partner records.
Depending on whether this component is enabled, the application offers an endpoint to import records from SaaS.
If enabled the application requires the environment variable `BPDM_SAAS_KEY` to contain an API key with necessary privileges for accessing the specified
storage.
Further, you need to provide a hostname (`BPDM_SAAS_HOST`), storage ID (`BPDM_SAAS_STORAGE`) and datasource ID `BPDM_SAAS_DATASOURCE` to specify from where the records
should be imported by the application.

### Helm Deployment

Expand All @@ -81,25 +77,21 @@ BPDM is a SpringBoot Kotlin software project managed by Maven and can be run wit

* Maven
* JDK17
* Connection to an SaaS for the sharing process
* Connection to BPDM Pool API
* Keycloak 17.0.0 (with enabled `auth` or `pool-auth` profile)

When running, the BPDM Gate requires a remote SaaS storage and datasource to exchange data with.
The application expects the environment variables `BPDM_SAAS_HOST`, `BPDM_SAAS_KEY`, `BPDM_SAAS_STORAGE` and `BPDM_SAAS_DATASOURCE` to contain the hostname to connect to, the API key and
the identifiers for the storage and datasource respectively.

The Gate also requires a connection to a BPDM Pool instance which is expected at `localhost` with port `8080` on default configuration.

You can find and edit the default configuration for the Gate in the `application.properties`, `application-auth.properties`
and `application-pool-auth.properties` files in the `resources` folder.

The REST API documentation can be accessed at http://localhost:8081/api/swagger-ui.
The REST API documentation can be accessed at http://localhost:8081/ui/swagger-ui/index.html.

### Profiles

The default configuration of the application is determined by the `application.properties` file.
Here you can find core application configuration such as Swagger documentation, SaaS and BPDM Pool connection.
Here you can find core application configuration such as Swagger documentation and BPDM Pool connection.

You can also run the project with Spring profiles to enable additional components on top of the default configuration.
Currently, the BPDM Gate offers the profiles `auth` and `auth-pool`.
Expand Down
28 changes: 28 additions & 0 deletions bpdm-bridge-dummy/DOCKER_NOTICE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
## Notice for Docker image

DockerHub: [https://hub.docker.com/r/tractusx/bpdm](https://hub.docker.com/r/tractusx/bpdm)

Eclipse Tractus-X product(s) installed within the image:

**BPDM Bridge**

Eclipse Tractus-X product(s) installed within the image:

- GitHub: https://github.com/eclipse-tractusx/bpdm
- Project home: https://projects.eclipse.org/projects/automotive.tractusx
- Bridge Dockerfile: https://github.com/eclipse-tractusx/bpdm/blob/main/bpdm-brige-dumy/Dockerfile
- Project license: [Apache License, Version 2.0](https://github.com/eclipse-tractusx/bpdm/blob/main/LICENSE)


**Used base image**

- [eclipse-temurin:17-jre-alpine](https://github.com/adoptium/containers)
- Official Eclipse Temurin DockerHub page: https://hub.docker.com/_/eclipse-temurin
- Eclipse Temurin Project: https://projects.eclipse.org/projects/adoptium.temurin
- Additional information about the Eclipse Temurin images: https://github.com/docker-library/repo-info/tree/master/repos/eclipse-temurin


As with all Docker images, these likely also contain other software which may be under other licenses
(such as Bash, etc. from the base distribution, along with any direct or indirect dependencies of the primary software being contained).

As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
4 changes: 4 additions & 0 deletions bpdm-bridge-dummy/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@
* SPDX-License-Identifier: Apache-2.0
******************************************************************************/

package org.eclipse.tractusx.bpdm.pool.api.model.response
package com.catenax.bpdm.bridge.dummy.config

import io.swagger.v3.oas.annotations.media.Schema
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration

@Schema(name = "SuggestionResponse", description = "Shows a ranked suggestion based on a given search text")
data class SuggestionResponse(
@Schema(description = "The suggestion text")
val suggestion: String,
@Schema(description = "Relative relevancy score indicating quality of the match, higher is better")
val relevancy: Float
)
@Configuration
@ConfigurationProperties(prefix = "bpdm.bridge")
class BridgeAuthProperties {
var syncAuthorities: List<String> = listOf()

val syncAuthority: String
get() = syncAuthorities.joinToString(", ") { "ROLE_$it" }
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ package com.catenax.bpdm.bridge.dummy.controller

import com.catenax.bpdm.bridge.dummy.service.SyncService
import io.swagger.v3.oas.annotations.Operation
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
Expand All @@ -35,6 +36,7 @@ class BridgeController(
summary = "Start sync between Gate and Pool"
)
@PostMapping("/sync")
@PreAuthorize("hasAnyAuthority(@bridgeAuthProperties.syncAuthority)")
fun triggerSync() {
syncService.sync()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@

package com.catenax.bpdm.bridge.dummy.dto

import org.eclipse.tractusx.bpdm.common.dto.LogisticAddressDto
import org.eclipse.tractusx.bpdm.gate.api.model.LogisticAddressGateDto

data class GateAddressInfo(
val address: LogisticAddressDto,
val address: LogisticAddressGateDto,
val externalId: String,
val legalEntityExternalId: String?,
val siteExternalId: String?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@
package com.catenax.bpdm.bridge.dummy.dto

import org.eclipse.tractusx.bpdm.common.dto.LegalEntityDto
import org.eclipse.tractusx.bpdm.gate.api.model.AddressGateInputResponse

data class GateLegalEntityInfo(
val legalNameParts: Array<String> = emptyArray(),
val legalNameParts: List<String> = emptyList(),
val legalEntity: LegalEntityDto,
val legalAddress: AddressGateInputResponse,
val externalId: String,
val bpn: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@

package com.catenax.bpdm.bridge.dummy.dto

import org.eclipse.tractusx.bpdm.common.dto.SiteDto
import org.eclipse.tractusx.bpdm.gate.api.model.LogisticAddressGateDto
import org.eclipse.tractusx.bpdm.gate.api.model.SiteGateDto

data class GateSiteInfo(
val site: SiteDto,
val site: SiteGateDto,
val externalId: String,
val legalEntityExternalId: String,
val mainAddress: LogisticAddressGateDto,
val bpn: String?
)
Loading