From 3d7e30c3c6c292ab87c4054a01dbee0703b3fa8a Mon Sep 17 00:00:00 2001 From: Ljupcho Palashevski Date: Fri, 15 Sep 2023 18:15:03 +0200 Subject: [PATCH 1/9] Runtime guide additions Signed-off-by: Ljupcho Palashevski --- .../planning/runtime/container-deployment.svg | 4 + .../runtime/deployment-options.drawio | 968 +++++++++++++++++- site/docs/guides/planning/runtime/overview.md | 13 + 3 files changed, 984 insertions(+), 1 deletion(-) create mode 100644 site/docs/guides/planning/runtime/container-deployment.svg diff --git a/site/docs/guides/planning/runtime/container-deployment.svg b/site/docs/guides/planning/runtime/container-deployment.svg new file mode 100644 index 0000000000..f07ad07274 --- /dev/null +++ b/site/docs/guides/planning/runtime/container-deployment.svg @@ -0,0 +1,4 @@ + + + +
Container Platform (ie Kubernetes)
Container Platform (ie Kubernetes)
Container
Container
OMAG Server
OMAG Server
Container
Container
OMAG Server
OMAG Server
...
...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/site/docs/guides/planning/runtime/deployment-options.drawio b/site/docs/guides/planning/runtime/deployment-options.drawio index 7851cb3a3d..5b8b9db071 100644 --- a/site/docs/guides/planning/runtime/deployment-options.drawio +++ b/site/docs/guides/planning/runtime/deployment-options.drawio @@ -1 +1,967 @@ -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 \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/guides/planning/runtime/overview.md b/site/docs/guides/planning/runtime/overview.md index 4a4a06219e..d9ab9f9a93 100644 --- a/site/docs/guides/planning/runtime/overview.md +++ b/site/docs/guides/planning/runtime/overview.md @@ -22,6 +22,9 @@ It is a simple command to move an OMAG Server from one platform instance to anot ![OMAG Server deployment choices](/concepts/egeria-operations-server-choices-no-description.svg) +!!! info "Container platform deployment" + Alternatively, for cloud or hybrid deployment scenarios you may want to move some of the platform responsibilities to orchestrated container hosting environment like Kubernetes. In such a scenario, OMAG servers run as individual containers. To visualize this looking at the topology picture at the beginning, the blue rounded boxes are Kubernetes clusters and orange circles are OMAG servers running as containers. Read more about this approach in [Container platform deployment](#container-platform-deployment) section below. + Different types of technology need different types of integration and Egeria has OMAG Servers to match. Each type of OMAG Server is focused on the integration of a specific type of tool, engine or platform: ![Types of OMAG Servers](/concepts/types-of-omag-servers.svg) @@ -80,6 +83,16 @@ This is a checklist of planning tasks for the deployment of your OMAG Server Pla - [ ] Plan your use of the [event bus](/concepts/event-bus): which technology to use (Apache Kafka is the default) and the names of the topics that your OMAG Servers will use. - [ ] Design the [governance zones](/concepts/governance-zone) that you want to use to control the visibility of assets to different communities of users - or processes. +## Container platform deployment + +Egeria software architecture adopts well the microservice architecture principles. OMAG server can be configured to provide specific capabilities and context bound metadata services. Container platform deployment style complements this with the runtime aspects allowing you to run OMAG servers independently as isolated, stateless and immutable containers. + +![Container platform](/guides/planning/runtime/container-deployment.svg) + +Kubernetes (or k8s) is de-facto standard platform for deploying, scaling and managing containerized applications. To support this deployment model better, Egeria offers implementation that is designed to start server in a container more efficiently complying with the principles mentioned above. We call this OMAG server starter. + +> It is very important to note that wether you choose to run server on a native OMAG platform or in a stand alone container runtime, the same functional principles apply - all servers are interoperable and comply to the open metadata exchange protocols. + ## More detail to follow... The text above is a very high level overview of the planning process. More detail will be added to this guide as time permits. From 414732eda8723471dc3bb6be2f7249e381db8371 Mon Sep 17 00:00:00 2001 From: Ljupcho Palashevski Date: Tue, 19 Sep 2023 17:31:13 +0200 Subject: [PATCH 2/9] Operations guide addons for server starter Signed-off-by: Ljupcho Palashevski --- .../opearate-omag-server-starter.md | 155 ++++++++++++++++++ site/mkdocs.yml | 1 + 2 files changed, 156 insertions(+) create mode 100644 site/docs/guides/operations/opearate-omag-server-starter.md diff --git a/site/docs/guides/operations/opearate-omag-server-starter.md b/site/docs/guides/operations/opearate-omag-server-starter.md new file mode 100644 index 0000000000..1c9dc88061 --- /dev/null +++ b/site/docs/guides/operations/opearate-omag-server-starter.md @@ -0,0 +1,155 @@ +# Operate OMAG Server Starter + +This guide focuses on providing instructions how to operate server as stand-alone application process. This deployment choice gives you low level control of the application runtime and it requires direct interaction with your IT infrastructure. + +With OMAG Server Starter each server runs in its own dedicated JVM process. All the required parameters to start a server are always determined up-front and supplied as configuration properties to the application. This approach is key to achieve immutable configuration state in case of running containerized deployment. + +> Quick jump to installation steps + +## Running OMAG Server Starter + +To run the OMAG server starter application you execute command in this format: + +`java -jar omag-server-{release}.jar ` + +or for example, to start with minimal sample configuration: + +```bash +java -jar omag-server-*.jar --omag.server-config-file=classpath:samples/metadata-repository-server.yml --server.port=9080 --server.ssl.enabled=false +``` + +```bash + Project Egeria - Open Metadata and Governance + ____ __ ___ ___ ______ _____ + / __ \ / |/ // | / ____/ / ___/ ___ ____ _ __ ___ ____ + / / / // /|_/ // /| | / / __ \__ \ / _ \ / __/| | / // _ \ / __/ + / /_/ // / / // ___ |/ /_/ / ___/ // __// / | |/ // __// / + \____//_/ /_//_/ |_|\____/ /____/ \___//_/ |___/ \___//_/ + + :: Powered by Spring Boot (v3.1.1) :: + +2023-09-19T15:10:45.763+02:00 INFO 94379 --- [ main] o.o.o.s.springboot.OMAGServer : Starting OMAGServer using Java 17.0.8.1 with PID 94379 (/server/omag-server-4.3.jar started by ***** in /server) +2023-09-19T15:10:45.765+02:00 INFO 94379 --- [ main] o.o.o.s.springboot.OMAGServer : No active profile set, falling back to 1 default profile: "default" +2023-09-19T15:10:47.488+02:00 INFO 94379 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9080 (http) +2023-09-19T15:10:47.497+02:00 INFO 94379 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2023-09-19T15:10:47.497+02:00 INFO 94379 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.10] +2023-09-19T15:10:47.565+02:00 INFO 94379 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2023-09-19T15:10:47.566+02:00 INFO 94379 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1756 ms +2023-09-19T15:10:48.356+02:00 INFO 94379 --- [ main] EnvironmentConfiguration$$SpringCGLIB$$0 : SSL configuration started working directory: /server +2023-09-19T15:10:48.824+02:00 INFO 94379 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator' +2023-09-19T15:10:48.895+02:00 INFO 94379 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9080 (http) with context path '' +2023-09-19T15:10:48.909+02:00 INFO 94379 --- [ main] o.o.o.s.springboot.OMAGServer : Started OMAGServer in 3.58 seconds (process running for 4.092) +2023-09-19T15:10:48.932+02:00 INFO 94379 --- [ main] o.o.o.s.s.config.OMAGConfigHelper : Using configuration from class path resource [samples/metadata-repository-server.yml] +2023-09-19T15:10:49.162+02:00 INFO 94379 --- [ main] o.o.o.s.springboot.OMAGServer : Sending activation request for server: cocoMDS1 and user: OMAGServer +2023-09-19T15:10:49.341+02:00 INFO 94379 --- [ main] o.o.o.s.springboot.OMAGServer : Activation succeeded for server: cocoMDS1 + +``` + +> Note that the java executable jar is different then in case of running OMAG server platform. + +## Configuration Reference + +Considering that the starter application is implemented using Spring Boot, we can use different styles to configure the server starter. It is a matter of choice in what way properties will be provided to the application: command line options, application properties or environment variables. The started application will load all and use them on startup. + +!!! info "Spring application external config" + If want to know more about how external configuration works, you can read more int the spring boot [core features](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config){ target=_blank } . + +OMAG server starter already has default [`application.properties`](https://github.com/odpi/egeria/blob/main/open-metadata-implementation/server-chassis/server-chassis-spring/src/main/resources/application.properties){ target=gh } packaged within the jar distribution. These properties can ba always overwritten if they are provided to the application externally. + +Below you can find reference properties that define the application behavior. + +### Server Configuration File + +| Property name | Environment variable | Description | Example | +|-------------------------|-----------------------|--------------|---------| +|`omag.server-config-file`|`OMAG_SERVERCONFIGFILE`| The OMAG server configuration file defining all subsystems and respective connectors. It should be valid [configuration document structure](/concepts/configuration-document/#configuration-document-structure). Can be written in .json or .yaml file format. | See [samples](https://github.com/odpi/egeria/tree/main/open-metadata-implementation/server-chassis/server-chassis-spring/src/main/resources/samples){ target=gh } | + +!!! tip "Creating configuration document" + The configuration document can be crafted by hand if you understand well [configuration document structure](/concepts/configuration-document/#configuration-document-structure). Safe option is to use OMAG server platform deployment and create configuration document using admin services. Refer to [Admin guide](/guides/admin/servers) to see how different server types are configured. Finally you can [retrieve](/guides/admin/servers/#retrieving-the-configuration) the valid document created for use with the server starter. + +### Additional Libraries + +| Property name | Environment variable | Description | Example | +|-------------------------|-----------------------|--------------|---------| +| `loader.path` | `LOADER_PATH` | The Spring Boot extended class-path. This is the main mechanism used to load externally Egeria or third party connector libraries. | loader.path="/deployments/server/lib" | + +### Web Server and SSL Transport + +| Property name | Environment variable | Description | Example | +|-------------------------|-----------------------|--------------|---------| +|`server.port` | SERVER_PORT | Server transport port | server.port=9443 | +|`server.ssl.enabled`| SERVER_SSL_ENABLED | Enables SSL transport for the embedded web server (Tomcat) | server.ssl.enabled=false disables server ssl. In this case all other server.ssl properties are not required. | +|`server.ssl.key-store`| SERVER_SSL_KEYSTORE | Java key-store file used to load the server certificates | server.ssl.key-store=keystore.p12 | +|`server.ssl.key-store-password`| SERVER_SSL_KEYSTORE_PASSWORD | Secret used by the server to access the key-store file | server.ssl.key-store-password=egeria | +|`server.ssl.keyStoreType` | SERVER_SSL_KEYSTORETYPE | The type of keystore file used | server.ssl.keyStoreType=PKCS12 | +|`server.ssl.keyAlias`| SERVER_SSL_KEYALIAS | The alias used for the ssl key | server.ssl.keyAlias=egeriaserverchassis | +|`server.ssl.trust-store` | SERVER_SSL_TRUSTSTORE | Java trust-store file used by the server | server.ssl.trust-store=truststore.p12 | +|`server.ssl.trust-store-password` | SERVER_SSL_TRUSTSTOREPASSWORD | Secret used by the server to access trust-store file | server.ssl.trust-store-password=egeria | +|`strict.ssl`| STRICT_SSL | Controls mTLS for http client, thats if ssl should be validated for outbound connections | strict.ssl=false will turn off client ssl validation for external servers (considered unsafe). | + +### Logging + +Default Spring Boot application [logging feature](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging){ target=_blank } is used as technical log implementation. Egeria [Audit Logs framework](/frameworks/alf/overview/) can be configured further via SLF4J connector to re-direct the OMAG logs to the technical logging or log directly via console connector (default). + +### Application availability + +The application availability state is managed in a standard way using [Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application.application-availability){ target=_blank } leveraging standard internal Spring application lifecycle and its states. + +Health state is exposed via management configuration as rest endpoints that can be used as probes for managing pod lifecycle in Kubernetes. + +Example using default actuator endpoints to retrieve health information: + +```bash +> curl http://localhost:9080/actuator/health/livenessState +{"status":"UP"} + +> curl http://localhost:9080/actuator/health/readinessState +{"status":"UP"} + +``` + +### Default logging and monitoring configuration + +Already configured with default `application.properties` + +```properties +logging.level.org.odpi.openmetadata=error +logging.level.org.odpi.openmetadata.frameworks.auditlog=info +logging.level.org.odpi.openmetadata.serverchassis.springboot=info + +management.health.defaults.enabled=false +management.health.livenessstate.enabled=true +management.health.readinessstate.enabled=true + +management.endpoints.enabled-by-default=false +management.endpoint.health.enabled=true +management.endpoint.health.show-details=always +management.endpoint.metrics.enabled=true +management.endpoints.web.exposure.include=metrics,health +``` + +More info on customizing common Application Properties can be found in spring [reference documentation](https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties){ target=_blank }. + +## Run in a Container + +To run the server starter application in a container you need container image. Egeria core image offers variety of options to run Egeria OMAG applications. As part of the official distribution, the full Egeria assembly is packaged as Docker image including the OMAG server started jar. The image is based on RedHat's [ubi9/openjdk-17](https://catalog.redhat.com/software/containers/ubi9/openjdk-17-runtime/61ee7d45384a3eb331996bee){ target=_blank } + +The executable jar is located in the image at following location: + +`/deployments/server/omag-server-{release}.jar` + +By modifying the environment variable `JAVA_APP_JAR` to point to this location, you modify the container entry point thus reusing the image configured by default to initialize OMAG server platform. + +All other settings can be configured by setting the environment variables configuring the OMAG server behavior. + +### Run in Docker + +To run OMAG Server as Metadata Repository using sample configuration execute following command: + +```bash +docker run --name omag-server -p 9443:9443 --env JAVA_APP_JAR="server/omag-server-4.3.jar" --env LOADER_PATH="/deployments/server/lib" --env OMAG_SERVERCONFIGFILE="classpath:samples/metadata-repository-server.json" quay.io/odpi/egeria:4.3 +``` + +### Run in Kubernetes + +To run in a Kubernetes environment, you need to make certain choices and properly plan the deployment resources. To showcase how simple single server deployment can be done we created [`omag-server`](https://github.com/odpi/egeria-charts/tree/main/charts/egeria-server){ target=gh } Helm chart. It can be used as quick reference for defining kubernetes deployment and configuration resources and planning more complex deployments. diff --git a/site/mkdocs.yml b/site/mkdocs.yml index 966c2788fc..c6f093c261 100644 --- a/site/mkdocs.yml +++ b/site/mkdocs.yml @@ -141,6 +141,7 @@ nav: - Migration: guides/migration/migrating-configuration-documents.md - Operations: - Operate OMAG Server Platform: guides/operations/overview.md + - Operate OMAG Server Starter: guides/operations/opearate-omag-server-starter.md - Egeria in Kubernetes: - Egeria in Kubernetes: guides/operations/kubernetes/index.md - Introduction to Kubernetes: guides/operations/kubernetes/k8s.md From d7a8478f5b3a16e73f227b91764328cd7375f815 Mon Sep 17 00:00:00 2001 From: Ljupcho Palashevski Date: Thu, 21 Sep 2023 10:19:23 +0200 Subject: [PATCH 3/9] minor correction Signed-off-by: Ljupcho Palashevski --- site/docs/guides/planning/runtime/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/docs/guides/planning/runtime/overview.md b/site/docs/guides/planning/runtime/overview.md index d9ab9f9a93..74daca342e 100644 --- a/site/docs/guides/planning/runtime/overview.md +++ b/site/docs/guides/planning/runtime/overview.md @@ -89,7 +89,7 @@ Egeria software architecture adopts well the microservice architecture principle ![Container platform](/guides/planning/runtime/container-deployment.svg) -Kubernetes (or k8s) is de-facto standard platform for deploying, scaling and managing containerized applications. To support this deployment model better, Egeria offers implementation that is designed to start server in a container more efficiently complying with the principles mentioned above. We call this OMAG server starter. +Kubernetes (or k8s) is de-facto standard platform for deploying, scaling and managing containerized applications. To support this deployment model better, Egeria offers implementation that is designed to start server in a container more efficiently complying with the principles mentioned above. > It is very important to note that wether you choose to run server on a native OMAG platform or in a stand alone container runtime, the same functional principles apply - all servers are interoperable and comply to the open metadata exchange protocols. From 0e22812b6fd368a0bc5ae280651049b0aa890815 Mon Sep 17 00:00:00 2001 From: Ljupcho Palashevski Date: Thu, 21 Sep 2023 10:53:00 +0200 Subject: [PATCH 4/9] fix link in omag-server-tutorial Signed-off-by: Ljupcho Palashevski --- site/docs/education/tutorials/omag-server-tutorial/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/docs/education/tutorials/omag-server-tutorial/overview.md b/site/docs/education/tutorials/omag-server-tutorial/overview.md index b5601bd5c9..20d123acd4 100644 --- a/site/docs/education/tutorials/omag-server-tutorial/overview.md +++ b/site/docs/education/tutorials/omag-server-tutorial/overview.md @@ -19,7 +19,7 @@ At the end of this tutorial you will be able to perform the following tasks. ## Prerequisite Tasks -* [Download and build Egeria](../building-egeria-tutorial) +* [Download and build Egeria](/education/tutorials/building-egeria-tutorial/overview) * [Familiarize yourself with the Postman test tool](/education/tutorials/postman-tutorial/overview) ## Tutorial Tasks From b485901251fdc25eb8d95aca7b9bd5735566385b Mon Sep 17 00:00:00 2001 From: Ljupcho Palashevski Date: Thu, 21 Sep 2023 12:44:43 +0200 Subject: [PATCH 5/9] Adding helm chart docs Signed-off-by: Ljupcho Palashevski --- .../operations/kubernetes/charts/overview.md | 3 +- .../operations/kubernetes/charts/server.md | 118 ++++++++++++++++++ .../opearate-omag-server-starter.md | 2 +- site/mkdocs.yml | 1 + 4 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 site/docs/guides/operations/kubernetes/charts/server.md diff --git a/site/docs/guides/operations/kubernetes/charts/overview.md b/site/docs/guides/operations/kubernetes/charts/overview.md index 61b9acdba5..a6c546a70f 100644 --- a/site/docs/guides/operations/kubernetes/charts/overview.md +++ b/site/docs/guides/operations/kubernetes/charts/overview.md @@ -9,10 +9,11 @@ See [Helm](../helm.md) for information on configuring Helm to be able to access ## Available Charts -* [base](base.md) - creates a simple Egeria environment with a single metadata server. Includes the Ecosystem UI so that metadata can be searched, browsed. +* [base](base.md) - Creates a simple Egeria environment with a single metadata server. Includes the Ecosystem UI so that metadata can be searched, browsed. * [odpi-egeria-lab](lab.md) - Demo scenario for 'Coco Pharmaceuticals'. Multiple platorms, metadata repositories, cohorts. Demonstration script via Juypter notebooks. Includes both the Ecosystem UI & business UI . * [cts](cts.md) - Supports testing repository connectors using our Conformance Test Suite. Can be configured to support other repositories via simple values. * [pts](pts.md) - Performance test suite to aid in measuring the performance of repository connectors. +* [server](server.md) - Demonstrates simple OMAG Server Starter configuration and deployment. ## Issues & Advanced usage: diff --git a/site/docs/guides/operations/kubernetes/charts/server.md b/site/docs/guides/operations/kubernetes/charts/server.md new file mode 100644 index 0000000000..d861f68261 --- /dev/null +++ b/site/docs/guides/operations/kubernetes/charts/server.md @@ -0,0 +1,118 @@ + + + +# Egeria Server Starter chart (egeria-server) + +Egeria Server Starter helm chart defines minimal deployment resources to demonstrate simple single OMAG Server Kubernetes deployment scenario. + +It produces following resources: + +- Deployment resource to describe the containers and related resources such as volumes; +- Configuration resources to describe environment configuration and application configuration files; +- Volumes to mapping configuration files to the container; +- Service that exposes the container port for external consumption. + +The chart can be used as a base to build more complex deployment topologies. + +## Configuration + +The container application is configured using standard deployment and config map resources customized by setting the values in 'app' map. See [values.yaml](https://github.com/odpi/egeria-charts/blob/main/charts/egeria-server/values.yaml){ target=gh } + +``````yaml +app: + jarPath: "/deployments/server" + jarName: "omag-server" + loaderPath: "/deployments/server/lib" + configPath: "/deployments/server/conf" + configName: "cocoMDS1.yml" + livenessProbe: "/actuator/health/livenessState" + readinessProbe: "/actuator/health/readinessState" +`````` + +| Name | Description | +|------|-------------| +|`app.jarPath` | The path where the boot jar application is located inside the image.| +|`app.jarName` | The name of the boot jar available on the `app.jarPath` location in the image. | +|`app.loaderPath` | The spring boot application `LOADER_PATH`. This is the classpath location for Egeria connector libraries and additional third party libraries to be loaded at runtime. | +|`app.configPath` | The location where configuration files will be located. Note this location is used as volume mount path inside the container. | +|`app.configName` | The name of the configuration file (json or yaml) that will be loaded from `app.configPath` by the OMAG server instance on start-up. | +|`app.livenessProbe` and `app.readinessProbe` | Standard kubernetes pod [probes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/){ target=_blank } representing liveness and readiness states respectively. | + +For demo purpose, the chart contains example configuration files located in the [files](https://github.com/odpi/egeria-charts/tree/main/charts/egeria-server/files){ target=gh } directory. The files placed here will be always copied as config map resources and mounted inside the container at location defined by `app.configPath`. From here, the server is trying to load the file defined by `app.configName` value. + +For more technical details check out the [config.yaml](https://github.com/odpi/egeria-charts/blob/main/charts/egeria-server/templates/config.yaml){ target=gh } and [deployment.yaml](https://github.com/odpi/egeria-charts/blob/main/charts/egeria-server/templates/deployment.yaml){ target=gh } resources. + +The container is configured to use Egeria main docker image. By modifying the default container entry point variable we are able to create new runtime environment similar to the standard OMAG platform deployment. The main [docker image](/guides/operations/kubernetes/container-images/) contains full egeria project assembly making it convenient for demo and testing. + +## Installation + +From helm repository: + +```bash +helm repo add egeria https://github.com/odpi/egeria-charts.git +helm repo update +helm install mds1 egeria/egeria-server +``` + +or locally, using git clone: + +```bash +git clone https://github.com/odpi/egeria-charts.git +cd egeria-charts +helm install mds1 charts/egeria-server -f charts/egeria-server/values.yaml +``` + +If installation for application instance with name `mds1` is successful, helm produces following output: + +```bash +NAME: mds1 +LAST DEPLOYED: Thu Sep 21 10:55:30 2023 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +NOTES: +# SPDX-License-Identifier: Apache-2.0 +# Copyright Contributors to the Egeria project. + +1. Get the application URL by running these commands: + export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=egeria-server,app.kubernetes.io/instance=mds1" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT + +``` + +!!! tip "Copy/paste the output above to your bash terminal to create port-forwarding rule to the container port instantly" + +To uninstall run: + +```bash +helm uninstall mds1 +``` + +## Accessing the OMAG Server + +To access the OMAG server via HTTP in a local kubernetes deployment, you can leverage `kubectl port-forward` steps described in the output info above. + +Or following the example steps: + +```bash +> kubectl get pods +NAME READY STATUS RESTARTS AGE +mds1-egeria-server-56fd5cb898-nzdx5 0/1 Running 0 8s +``` + +```bash +> kubectl port-forward mds1-egeria-server-56fd5cb898-nzdx5 8080 +Forwarding from 127.0.0.1:8080 -> 8080 +Forwarding from [::1]:8080 -> 8080 +``` + +At this point, the OMAG server should already be responding via HTTP host address/port: + +```bash +> curl http://localhost:8080/actuator/health +{"status":"UP","components":{"livenessState":{"status":"UP"},"readinessState":{"status":"UP"}},"groups":["liveness","readiness"]} +``` + +For real production deployments, depending on what is available for your K8S environment you will probably leverage different mechanism to expose the service like ingress or static routes. diff --git a/site/docs/guides/operations/opearate-omag-server-starter.md b/site/docs/guides/operations/opearate-omag-server-starter.md index 1c9dc88061..0e84c57510 100644 --- a/site/docs/guides/operations/opearate-omag-server-starter.md +++ b/site/docs/guides/operations/opearate-omag-server-starter.md @@ -4,7 +4,7 @@ This guide focuses on providing instructions how to operate server as stand-alon With OMAG Server Starter each server runs in its own dedicated JVM process. All the required parameters to start a server are always determined up-front and supplied as configuration properties to the application. This approach is key to achieve immutable configuration state in case of running containerized deployment. -> Quick jump to installation steps +> Quick jump to installation steps (coming soon) ## Running OMAG Server Starter diff --git a/site/mkdocs.yml b/site/mkdocs.yml index c6f093c261..8b72f784a2 100644 --- a/site/mkdocs.yml +++ b/site/mkdocs.yml @@ -154,6 +154,7 @@ nav: - Coco Pharmaceuticals Lab: guides/operations/kubernetes/charts/lab.md - CTS Chart: guides/operations/kubernetes/charts/cts.md - PTS Chart: guides/operations/kubernetes/charts/pts.md + - Server Starter Chart: guides/operations/kubernetes/charts/server.md - Container Images: guides/operations/kubernetes/container-images.md - Custom Deployment: guides/operations/kubernetes/custom-deployment.md - Egeria Operator: guides/operations/kubernetes/operator.md From 10d389b65e2aed5c3023e6c379bd5c817416aa52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tun=C3=A7=20Taylan=20Turun=C3=A7?= Date: Thu, 28 Sep 2023 14:54:00 +0200 Subject: [PATCH 6/9] Fixed some typos and improved readability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tunç Taylan Turunç --- ...rter.md => operate-omag-server-starter.md} | 62 +++++++++---------- site/docs/guides/planning/runtime/overview.md | 4 +- site/mkdocs.yml | 2 +- 3 files changed, 34 insertions(+), 34 deletions(-) rename site/docs/guides/operations/{opearate-omag-server-starter.md => operate-omag-server-starter.md} (52%) diff --git a/site/docs/guides/operations/opearate-omag-server-starter.md b/site/docs/guides/operations/operate-omag-server-starter.md similarity index 52% rename from site/docs/guides/operations/opearate-omag-server-starter.md rename to site/docs/guides/operations/operate-omag-server-starter.md index 0e84c57510..e25a1450ee 100644 --- a/site/docs/guides/operations/opearate-omag-server-starter.md +++ b/site/docs/guides/operations/operate-omag-server-starter.md @@ -1,18 +1,18 @@ # Operate OMAG Server Starter -This guide focuses on providing instructions how to operate server as stand-alone application process. This deployment choice gives you low level control of the application runtime and it requires direct interaction with your IT infrastructure. +This guide focuses on providing instructions for running the server as standalone application process. This deployment option gives you low level over the application runtime and requires direct interaction with your IT infrastructure. -With OMAG Server Starter each server runs in its own dedicated JVM process. All the required parameters to start a server are always determined up-front and supplied as configuration properties to the application. This approach is key to achieve immutable configuration state in case of running containerized deployment. +With OMAG Server Starter, each server runs in its own dedicated JVM process. All the required parameters required to start a server are always pre-defined and delivered to the application as configuration properties. This approach is key to achieving an immutable configuration state when running containerised deployments. > Quick jump to installation steps (coming soon) ## Running OMAG Server Starter -To run the OMAG server starter application you execute command in this format: +To run the OMAG Server Starter application, execute the command in this format: `java -jar omag-server-{release}.jar ` -or for example, to start with minimal sample configuration: +or, for example, to start with a minimal sample configuration: ```bash java -jar omag-server-*.jar --omag.server-config-file=classpath:samples/metadata-repository-server.yml --server.port=9080 --server.ssl.enabled=false @@ -45,33 +45,33 @@ java -jar omag-server-*.jar --omag.server-config-file=classpath:samples/metadata ``` -> Note that the java executable jar is different then in case of running OMAG server platform. +> Note that the Java executable jar is different than when running the OMAG server platform. ## Configuration Reference -Considering that the starter application is implemented using Spring Boot, we can use different styles to configure the server starter. It is a matter of choice in what way properties will be provided to the application: command line options, application properties or environment variables. The started application will load all and use them on startup. +Considering that the starter application is implemented using Spring Boot, we can use different styles to configure the server starter. It is a matter of choice how to provide properties to the application: Command line options, application properties or environment variables. The launched application will load them all and use them on startup. !!! info "Spring application external config" - If want to know more about how external configuration works, you can read more int the spring boot [core features](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config){ target=_blank } . + If you want to know more about how external configuration works, you can read more about it in the Spring Boot [Core Features](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config){ target=_blank } . -OMAG server starter already has default [`application.properties`](https://github.com/odpi/egeria/blob/main/open-metadata-implementation/server-chassis/server-chassis-spring/src/main/resources/application.properties){ target=gh } packaged within the jar distribution. These properties can ba always overwritten if they are provided to the application externally. +OMAG Server Starter already has default [`application.properties`](https://github.com/odpi/egeria/blob/main/open-metadata-implementation/server-chassis/server-chassis-spring/src/main/resources/application.properties){ target=gh } packaged within the jar distribution. These properties can always be overridden if provided externally to the application. -Below you can find reference properties that define the application behavior. +Below are reference properties that define the behaviour of the application. ### Server Configuration File | Property name | Environment variable | Description | Example | |-------------------------|-----------------------|--------------|---------| -|`omag.server-config-file`|`OMAG_SERVERCONFIGFILE`| The OMAG server configuration file defining all subsystems and respective connectors. It should be valid [configuration document structure](/concepts/configuration-document/#configuration-document-structure). Can be written in .json or .yaml file format. | See [samples](https://github.com/odpi/egeria/tree/main/open-metadata-implementation/server-chassis/server-chassis-spring/src/main/resources/samples){ target=gh } | +|`omag.server-config-file`|`OMAG_SERVERCONFIGFILE`| The OMAG server configuration file that defines all subsystems and their connectors. It should be valid [Configuration Document Structure](/concepts/configuration-document/#configuration-document-structure). Can be written in .json or .yaml file format. | See [samples](https://github.com/odpi/egeria/tree/main/open-metadata-implementation/server-chassis/server-chassis-spring/src/main/resources/samples){ target=gh } | !!! tip "Creating configuration document" - The configuration document can be crafted by hand if you understand well [configuration document structure](/concepts/configuration-document/#configuration-document-structure). Safe option is to use OMAG server platform deployment and create configuration document using admin services. Refer to [Admin guide](/guides/admin/servers) to see how different server types are configured. Finally you can [retrieve](/guides/admin/servers/#retrieving-the-configuration) the valid document created for use with the server starter. + The configuration document can be created by hand if you have a good understanding of [Configuration Document Structure](/concepts/configuration-document/#configuration-document-structure). A safe option is to use the OMAG server platform deployment and create the configuration document using the admin services. See the [Admin Guide](/guides/admin/servers) to configure different types of servers. Finally, you can [retrieve](/guides/admin/servers/#retrieving-the-configuration) the valid document created for use with the Server Starter. ### Additional Libraries | Property name | Environment variable | Description | Example | |-------------------------|-----------------------|--------------|---------| -| `loader.path` | `LOADER_PATH` | The Spring Boot extended class-path. This is the main mechanism used to load externally Egeria or third party connector libraries. | loader.path="/deployments/server/lib" | +| `loader.path` | `LOADER_PATH` | The Spring Boot extended class path. This is the main mechanism used to load external Egeria or third party connector libraries. | loader.path="/deployments/server/lib" | ### Web Server and SSL Transport @@ -79,25 +79,25 @@ Below you can find reference properties that define the application behavior. |-------------------------|-----------------------|--------------|---------| |`server.port` | SERVER_PORT | Server transport port | server.port=9443 | |`server.ssl.enabled`| SERVER_SSL_ENABLED | Enables SSL transport for the embedded web server (Tomcat) | server.ssl.enabled=false disables server ssl. In this case all other server.ssl properties are not required. | -|`server.ssl.key-store`| SERVER_SSL_KEYSTORE | Java key-store file used to load the server certificates | server.ssl.key-store=keystore.p12 | -|`server.ssl.key-store-password`| SERVER_SSL_KEYSTORE_PASSWORD | Secret used by the server to access the key-store file | server.ssl.key-store-password=egeria | +|`server.ssl.key-store`| SERVER_SSL_KEYSTORE | Java keystore file used to load server certificates | server.ssl.key-store=keystore.p12 | +|`server.ssl.key-store-password`| SERVER_SSL_KEYSTORE_PASSWORD | Secret used by the server to access the keystore file | server.ssl.key-store-password=egeria | |`server.ssl.keyStoreType` | SERVER_SSL_KEYSTORETYPE | The type of keystore file used | server.ssl.keyStoreType=PKCS12 | -|`server.ssl.keyAlias`| SERVER_SSL_KEYALIAS | The alias used for the ssl key | server.ssl.keyAlias=egeriaserverchassis | -|`server.ssl.trust-store` | SERVER_SSL_TRUSTSTORE | Java trust-store file used by the server | server.ssl.trust-store=truststore.p12 | -|`server.ssl.trust-store-password` | SERVER_SSL_TRUSTSTOREPASSWORD | Secret used by the server to access trust-store file | server.ssl.trust-store-password=egeria | -|`strict.ssl`| STRICT_SSL | Controls mTLS for http client, thats if ssl should be validated for outbound connections | strict.ssl=false will turn off client ssl validation for external servers (considered unsafe). | +|`server.ssl.keyAlias`| SERVER_SSL_KEYALIAS | The alias used for the SSL key | server.ssl.keyAlias=egeriaserverchassis | +|`server.ssl.trust-store` | SERVER_SSL_TRUSTSTORE | Java truststore file used by the server | server.ssl.trust-store=truststore.p12 | +|`server.ssl.trust-store-password` | SERVER_SSL_TRUSTSTOREPASSWORD | Secret used by the server to access truststore file | server.ssl.trust-store-password=egeria | +|`strict.ssl`| STRICT_SSL | Controls mTLS for the http client, i.e. whether to validate SSL for outgoing connections. | strict.ssl=false will disable client SSL validation for external servers (considered insecure). | ### Logging -Default Spring Boot application [logging feature](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging){ target=_blank } is used as technical log implementation. Egeria [Audit Logs framework](/frameworks/alf/overview/) can be configured further via SLF4J connector to re-direct the OMAG logs to the technical logging or log directly via console connector (default). +The default Spring Boot application [logging feature](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging){ target=_blank } is used as the technical logging implementation. Egeria [Audit Logs framework](/frameworks/alf/overview/) can be further configured via the SLF4J connector to redirect the OMAG logs to the technical logging or to log directly via the console connector (default). ### Application availability -The application availability state is managed in a standard way using [Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application.application-availability){ target=_blank } leveraging standard internal Spring application lifecycle and its states. +Application availability state is managed in a standard way using [Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application.application-availability){ target=_blank } leveraging the standard internal Spring application lifecycle and its states. -Health state is exposed via management configuration as rest endpoints that can be used as probes for managing pod lifecycle in Kubernetes. +Health state is exposed via management configuration as rest endpoints, which can be used as probes to manage pod lifecycle in Kubernetes. -Example using default actuator endpoints to retrieve health information: +Example using standard actuator endpoints to retrieve health information: ```bash > curl http://localhost:9080/actuator/health/livenessState @@ -128,23 +128,23 @@ management.endpoint.metrics.enabled=true management.endpoints.web.exposure.include=metrics,health ``` -More info on customizing common Application Properties can be found in spring [reference documentation](https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties){ target=_blank }. +For more information on customising common application properties, see the Spring [Reference Documentation](https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties){ target=_blank }. -## Run in a Container +## Running in a container -To run the server starter application in a container you need container image. Egeria core image offers variety of options to run Egeria OMAG applications. As part of the official distribution, the full Egeria assembly is packaged as Docker image including the OMAG server started jar. The image is based on RedHat's [ubi9/openjdk-17](https://catalog.redhat.com/software/containers/ubi9/openjdk-17-runtime/61ee7d45384a3eb331996bee){ target=_blank } +To run the server starter application in a container, you need a container image. The Egeria core image provides a variety of ways to run Egeria OMAG applications. As part of the official distribution, the complete Egeria assembly is packaged as a Docker image, including the OMAG server starter jar. The image is based on RedHat's [ubi9/openjdk-17](https://catalog.redhat.com/software/containers/ubi9/openjdk-17-runtime/61ee7d45384a3eb331996bee){ target=_blank } . -The executable jar is located in the image at following location: +The executable jar is located in the following location in the image: `/deployments/server/omag-server-{release}.jar` -By modifying the environment variable `JAVA_APP_JAR` to point to this location, you modify the container entry point thus reusing the image configured by default to initialize OMAG server platform. +By modifying the environment variable `JAVA_APP_JAR` to point to this location, you modify the container entry point and reuse the image configured by default to initialise the OMAG server platform. -All other settings can be configured by setting the environment variables configuring the OMAG server behavior. +All other settings can be configured by setting the environment variables that configure the OMAG server behaviour. -### Run in Docker +### Running in Docker -To run OMAG Server as Metadata Repository using sample configuration execute following command: +To run OMAG Server as a metadata repository using the sample configuration, run the following command: ```bash docker run --name omag-server -p 9443:9443 --env JAVA_APP_JAR="server/omag-server-4.3.jar" --env LOADER_PATH="/deployments/server/lib" --env OMAG_SERVERCONFIGFILE="classpath:samples/metadata-repository-server.json" quay.io/odpi/egeria:4.3 @@ -152,4 +152,4 @@ docker run --name omag-server -p 9443:9443 --env JAVA_APP_JAR="server/omag-serve ### Run in Kubernetes -To run in a Kubernetes environment, you need to make certain choices and properly plan the deployment resources. To showcase how simple single server deployment can be done we created [`omag-server`](https://github.com/odpi/egeria-charts/tree/main/charts/egeria-server){ target=gh } Helm chart. It can be used as quick reference for defining kubernetes deployment and configuration resources and planning more complex deployments. +To run in a Kubernetes environment, you need to make certain choices and properly plan the deployment resources. To show how easy a single server deployment can be, we have created a [`omag-server`](https://github.com/odpi/egeria-charts/tree/main/charts/egeria-server){ target=gh } Helm chart. It can be used as a quick reference for defining Kubernetes deployment and configuration resources, and for planning more complex deployments. diff --git a/site/docs/guides/planning/runtime/overview.md b/site/docs/guides/planning/runtime/overview.md index 74daca342e..7bf97ca203 100644 --- a/site/docs/guides/planning/runtime/overview.md +++ b/site/docs/guides/planning/runtime/overview.md @@ -23,7 +23,7 @@ It is a simple command to move an OMAG Server from one platform instance to anot ![OMAG Server deployment choices](/concepts/egeria-operations-server-choices-no-description.svg) !!! info "Container platform deployment" - Alternatively, for cloud or hybrid deployment scenarios you may want to move some of the platform responsibilities to orchestrated container hosting environment like Kubernetes. In such a scenario, OMAG servers run as individual containers. To visualize this looking at the topology picture at the beginning, the blue rounded boxes are Kubernetes clusters and orange circles are OMAG servers running as containers. Read more about this approach in [Container platform deployment](#container-platform-deployment) section below. + Alternatively, for cloud or hybrid deployment scenarios, you may want to offload some of the platform responsibilities to an orchestrated container hosting environment such as Kubernetes. In such a scenario, OMAG servers run as individual containers. To visualise this, look at the topology image at the beginning: The blue rounded boxes are Kubernetes clusters and the orange circles are OMAG servers running as containers. Read more about this approach in the [Container Platform Deployment](#container-platform-deployment) section below. Different types of technology need different types of integration and Egeria has OMAG Servers to match. Each type of OMAG Server is focused on the integration of a specific type of tool, engine or platform: @@ -93,7 +93,7 @@ Kubernetes (or k8s) is de-facto standard platform for deploying, scaling and man > It is very important to note that wether you choose to run server on a native OMAG platform or in a stand alone container runtime, the same functional principles apply - all servers are interoperable and comply to the open metadata exchange protocols. -## More detail to follow... +## More detail to follow The text above is a very high level overview of the planning process. More detail will be added to this guide as time permits. diff --git a/site/mkdocs.yml b/site/mkdocs.yml index 8b72f784a2..8f6628bdef 100644 --- a/site/mkdocs.yml +++ b/site/mkdocs.yml @@ -141,7 +141,7 @@ nav: - Migration: guides/migration/migrating-configuration-documents.md - Operations: - Operate OMAG Server Platform: guides/operations/overview.md - - Operate OMAG Server Starter: guides/operations/opearate-omag-server-starter.md + - Operate OMAG Server Starter: guides/operations/operate-omag-server-starter.md - Egeria in Kubernetes: - Egeria in Kubernetes: guides/operations/kubernetes/index.md - Introduction to Kubernetes: guides/operations/kubernetes/k8s.md From 49971c350e8bb51aff3587962c8101218b13c945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tun=C3=A7=20Taylan=20Turun=C3=A7?= Date: Wed, 4 Oct 2023 09:13:35 +0200 Subject: [PATCH 7/9] Added the missing word MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tunç Taylan Turunç --- site/docs/guides/operations/operate-omag-server-starter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/docs/guides/operations/operate-omag-server-starter.md b/site/docs/guides/operations/operate-omag-server-starter.md index e25a1450ee..6f1953d646 100644 --- a/site/docs/guides/operations/operate-omag-server-starter.md +++ b/site/docs/guides/operations/operate-omag-server-starter.md @@ -1,6 +1,6 @@ # Operate OMAG Server Starter -This guide focuses on providing instructions for running the server as standalone application process. This deployment option gives you low level over the application runtime and requires direct interaction with your IT infrastructure. +This guide focuses on providing instructions for running the server as standalone application process. This deployment option gives you a low level control over the application runtime and requires direct interaction with your IT infrastructure. With OMAG Server Starter, each server runs in its own dedicated JVM process. All the required parameters required to start a server are always pre-defined and delivered to the application as configuration properties. This approach is key to achieving an immutable configuration state when running containerised deployments. From 469f8753a259ac4d5c50b04419f661cb0b174c9f Mon Sep 17 00:00:00 2001 From: Ljupcho Palashevski Date: Wed, 4 Oct 2023 13:44:53 +0200 Subject: [PATCH 8/9] minor: change link to helm chart Signed-off-by: Ljupcho Palashevski --- site/docs/guides/operations/operate-omag-server-starter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/docs/guides/operations/operate-omag-server-starter.md b/site/docs/guides/operations/operate-omag-server-starter.md index 6f1953d646..49f5c1cafb 100644 --- a/site/docs/guides/operations/operate-omag-server-starter.md +++ b/site/docs/guides/operations/operate-omag-server-starter.md @@ -147,9 +147,9 @@ All other settings can be configured by setting the environment variables that c To run OMAG Server as a metadata repository using the sample configuration, run the following command: ```bash -docker run --name omag-server -p 9443:9443 --env JAVA_APP_JAR="server/omag-server-4.3.jar" --env LOADER_PATH="/deployments/server/lib" --env OMAG_SERVERCONFIGFILE="classpath:samples/metadata-repository-server.json" quay.io/odpi/egeria:4.3 +docker run --name omag-server -p 9443:9443 --env JAVA_APP_JAR="/deployments/server/omag-server-4.3.jar" --env LOADER_PATH="/deployments/server/lib" --env OMAG_SERVERCONFIGFILE="classpath:samples/metadata-repository-server.json" quay.io/odpi/egeria:4.3 ``` ### Run in Kubernetes -To run in a Kubernetes environment, you need to make certain choices and properly plan the deployment resources. To show how easy a single server deployment can be, we have created a [`omag-server`](https://github.com/odpi/egeria-charts/tree/main/charts/egeria-server){ target=gh } Helm chart. It can be used as a quick reference for defining Kubernetes deployment and configuration resources, and for planning more complex deployments. +To run in a Kubernetes environment, you need to make certain choices and properly plan the deployment resources. To show how easy a single server deployment can be, we have created a [`egeria-server`](/guides/operations/kubernetes/charts/server/) Helm chart. It can be used as a quick reference for defining Kubernetes deployment and configuration resources, and for planning more complex deployments. From fe1146f80a9f8053fcdbd43ecd913a5db2811685 Mon Sep 17 00:00:00 2001 From: Mandy Chessell Date: Tue, 10 Oct 2023 19:53:36 +0100 Subject: [PATCH 9/9] Add new types and OMVS descriptions for EO data Signed-off-by: Mandy Chessell --- site/docs/release-notes/4-3.md | 6 +- site/docs/release-notes/4-4.md | 8 + .../omvs/collection-manager/overview.md | 41 +++ site/docs/services/omvs/index.md | 6 +- .../omvs/notification-inbox/overview.md | 34 ++ .../omvs/notification-manager/overview.md | 47 +++ .../services/omvs/project-manager/overview.md | 36 ++ site/docs/types/0/0021-Collections.md | 32 +- site/docs/types/0/0021-Collections.svg | 4 +- ...ea-0-basic-types-and-infrastructure.drawio | 326 ++++++++++++++---- site/docs/types/0/automated-collection.svg | 4 + .../types/0/collection-hierarchy-example.svg | 4 + site/docs/types/1/0130-Projects.md | 48 ++- site/docs/types/1/0130-Projects.svg | 4 +- site/docs/types/1/area-1-collaboration.drawio | 18 +- site/docs/types/2/0210-Data-Stores.md | 12 + site/docs/types/2/0210-Data-Stores.svg | 2 +- site/docs/types/2/area-2-assets.drawio | 31 +- 18 files changed, 565 insertions(+), 98 deletions(-) create mode 100644 site/docs/services/omvs/collection-manager/overview.md create mode 100644 site/docs/services/omvs/notification-inbox/overview.md create mode 100644 site/docs/services/omvs/notification-manager/overview.md create mode 100644 site/docs/services/omvs/project-manager/overview.md create mode 100644 site/docs/types/0/automated-collection.svg create mode 100644 site/docs/types/0/collection-hierarchy-example.svg diff --git a/site/docs/release-notes/4-3.md b/site/docs/release-notes/4-3.md index e6466f071d..dc6df5147c 100644 --- a/site/docs/release-notes/4-3.md +++ b/site/docs/release-notes/4-3.md @@ -21,8 +21,8 @@ Release 4.3 continues the process of improving Egeria's usability. These change Each directory in the assembly includes a README.md file to explain its contents. -??? functional "New OMAG server stand alone runtime" - We are releasing tech preview for the stand-alone OMAG server spring boot launcher application. This is the first milestone achieved as result of the work planned in the Cloud Native workgroup. It is step forward to enable additional deployment/operation model more suitable for orchestrated container runtime environment such as Kubernetes. Functionally, it runs the same set of OMAG server capabilities/services as if you are running 'virtual' server instance on an OMAG platform. Irrespective of the operating style the OMAG servers are always interoperable. +??? functional "New OMAG server standalone runtime" + We are releasing tech preview for the standalone OMAG server spring boot launcher application. This is the first milestone achieved as result of the work planned in the Cloud Native workgroup. It is step forward to enable additional deployment/operation model more suitable for orchestrated container runtime environment such as Kubernetes. Functionally, it runs the same set of OMAG server capabilities/services as if you are running 'virtual' server instance on an OMAG platform. Irrespective of the operating style the OMAG servers are always interoperable. We are working to update the guides on the website to address this new feature. @@ -37,7 +37,7 @@ Release 4.3 continues the process of improving Egeria's usability. These change The utilities located in `egeria-dev-projects.git` are now located in `egeria.git` under the `open-metadata-resources` module. They are now included automatically in the `omag-server-platform` assembly. These utilities are used in the [Developer Dojo](/education/egeria-dojo/developer/overview). This will be updated to use the new assembly once release 4.3 is shipped. ??? functional "Extended integration connector function" - [Integration connectors](/concepts/integration-connector) can now check to see if they are in the middle of refresh() processing. This is valuable in multi-threaded operation, for example when processing events. Typically many of the events that are generated while the connector is being called to `refresh()` are caused by the connector's activity. There is a new method on the integration context called [`isRefreshInProgress()`](https://odpi.github.io/egeria/org/odpi/openmetadata/frameworks/integration/context/IntegrationContext.html). It returns true if the connector is currently running its `refresh()` method. An example of how to use this method is found in the [developer guide](/guides/developer/integration-connectors/overview/#registering-a-listener-with-open-metadata). + [Integration connectors](/concepts/integration-connector) can now check to see if they are in the middle of refresh() processing. This is valuable in multi-threaded operation, for example when processing events. Typically, many of the events that are generated while the connector is being called to `refresh()` are caused by the connector's activity. There is a new method on the integration context called [`isRefreshInProgress()`](https://odpi.github.io/egeria/org/odpi/openmetadata/frameworks/integration/context/IntegrationContext.html). It returns true if the connector is currently running its `refresh()` method. An example of how to use this method is found in the [developer guide](/guides/developer/integration-connectors/overview/#registering-a-listener-with-open-metadata). ??? functional "New configuration command for when a cohort member moves platform" Servers that are [members of a cohort](/concepts/cohort-member) regularly broadcast their network address to other members to allow them to dynamically configure their federated query support. This network address is configured in the OMAG Server's [configuration document](/concepts/configuration-document) as the `localRepositoryRemoteConnection`'s endpoint address. When an OMAG Server is relocated to a new platform, this address must change. There is a new administration command called [`resetRemoteCohortURL`]() with URL `POST {platformURLRoot}/open-metadata/admin-services/users/{userId}/servers/{serverName}/local-repository/configuration/remote-repository-connector-url`. The new URL is passed in the request body: diff --git a/site/docs/release-notes/4-4.md b/site/docs/release-notes/4-4.md index 8d497e4551..a6a9386f7a 100644 --- a/site/docs/release-notes/4-4.md +++ b/site/docs/release-notes/4-4.md @@ -5,4 +5,12 @@ _**These are DRAFT release notes. The notes will be updated until & when 4.4 is released**_ +??? functional "Open Metadata Types" + * A new classification called [*RootCollection*](/types/0/0021-Collections) can be added to a collection entity to indicate that it is the root of collection hierarchy. + * The [*Collection*](/types/0/0021-Collections) entity has a new attribute called *collectionType* that can be used to identify the concept that the collection represents. + * A new classification called [*PersonalProject*](/types/1/0130-Projects) can be added to a project entity to indicate that this is an informal project that have been created by an individual to help them organize their work. + * A new classification called [*DataScope*](/types/2/0210-Data-Stores) can be added to a referenceable entity (typically a DataStore or DataSet) to define the scope of the associated data resource in space and time. + + + --8<-- "snippets/abbr.md" diff --git a/site/docs/services/omvs/collection-manager/overview.md b/site/docs/services/omvs/collection-manager/overview.md new file mode 100644 index 0000000000..0ce8f9f0bb --- /dev/null +++ b/site/docs/services/omvs/collection-manager/overview.md @@ -0,0 +1,41 @@ +--- +hide: +- toc +--- + + + + +--8<-- "snippets/content-status/in-development.md" + +# Collection Manager OMVS + +The Collection Manager Open Metadata View Services (OMVS) is a REST API designed to back user interfaces (UIs) that support the maintenance and browsing of hierarchies of [collections](/concepts/collection) and their members. + +Collections are used to organize elements. Elements (including other collections) are linked to a collection to show that they are a member of the collection. An element can be a member of none, one or multiple collections. + +There are different types of collections: + +* **Collection Hierarchy** - A collection hierarchy is the root node of a hierarchy of collections. Its members are typically other collections. +* **Folder** - a collection folder is a collection that is part of a collection hierarchy structure. It may have members that are collections and/or other types of collections. +* **Digital Product** - A digital product is a collection of [assets](/concepts/asset) that have been especially crafted to support a specific use case (or related use cases). The assets may represent different versions of the product or customized versions of the same data for different purposed, or supporting different non-functional requirements. + +The Collection Manager OMVS supports: + +* The creation and maintenance of the properties associated with a collection. New collections can be created using another collection as a template. +* The management of the members of a collection. +* The attachment of a collection as a resource of an entity such as a project, community or user's profile. +* The ability to mark a collection as a template and search for the template collections in the open metadata ecosystem. +* The ability to search collections, with or without particular classifications and properties and navigate through a collection's membership. + + + + + +---8<-- "snippets/abbr.md" + + + + + + diff --git a/site/docs/services/omvs/index.md b/site/docs/services/omvs/index.md index d402023506..e1785d52ea 100644 --- a/site/docs/services/omvs/index.md +++ b/site/docs/services/omvs/index.md @@ -9,7 +9,11 @@ The view services are as follows: | OMVS | Summary | Description | |-----------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [My Profile](/services/omvs/my-profile/overview) | **Locate, retrieve and update information relating to the calling user's profile.** | The My Profile OMVS is for user interfaces supporting a personalized experience. A registered user is able to maintain information about themselves and their network as well as set up and use personalized collections of metadata elements. | +| [My Profile](/services/omvs/my-profile/overview) | **Locate, retrieve and update information relating to the calling user's profile.** | The My Profile OMVS is for user interfaces supporting a personalized experience. A registered user is able to maintain information about themselves, their roles and their network. | +| [Collection Manager](/services/omvs/collection-manager/overview) | **Locate, retrieve and update collections and their membership.** | The Collection Manager OMVS is for user interfaces supporting the ability to search for and navigate through hierarchies of collections. A registered user is able to maintain the contents of collections and attach specific collections to their profile, project or community. | +| [Notification Manager](/services/omvs/notification-manager/overview) | **Locate, retrieve and update the types of user notifications that should be produced.** | The Notification Manager OMVS is for user interfaces supporting personalized notifications to specific users. A registered user is able to define which types of notification should be produced and who they should be delivered to. | +| [Notification Inbox](/services/omvs/notification-inbox/overview) | **Locate, retrieve and process the notifications for the calling user.** | The Notification Inbox OMVS is for user interfaces supporting personalized notifications to the calling user. A registered user is able to view their notifications, update their status and delete them. | +| [Project Manager](/services/omvs/project-manager/overview) | **Locate, retrieve and update information relating to projects.** | The Project Manager OMVS is for user interfaces supporting projects, either for a group of people or personalized sandboxes for individuals. A registered user is able to maintain information about a project and link it with other projects, users and resources. | | [Glossary Author](/services/omvs/glossary-author/overview) | **Develop new glossary terms and categories.** | The Glossary Author OMVS is for user interfaces supporting the creating and editing of glossary content, such as glossary terms and categories. The changes made are immediately visible to all users. | | [Glossary Browser](/services/omvs/glossary-browser/overview) | **Search and view the contents of specific glossaries and their links to governance definitions and assets.** | The Glossary Browser OMVS is for user interfaces that wish to provide search facilities within a single glossary (or glossaries) along with the ability to browse the structure of the glossary and view an element within a glossary along with connected governance classifications, governance definitions, user feedback and attached assets. | | [Glossary Workflow](/services/omvs/glossary-workflow/overview) | **Develop new glossary terms and categories in a controlled workflow process.** | The Glossary Workflow OMVS is for user interfaces supporting the creation and editing of glossary content, such as glossary terms and categories, in a controlled workflow process. This means that as terms and categories are created, updated and deleted, these changes are invisible to the general user until they are approved. | diff --git a/site/docs/services/omvs/notification-inbox/overview.md b/site/docs/services/omvs/notification-inbox/overview.md new file mode 100644 index 0000000000..e07579b287 --- /dev/null +++ b/site/docs/services/omvs/notification-inbox/overview.md @@ -0,0 +1,34 @@ +--- +hide: +- toc +--- + + + + +--8<-- "snippets/content-status/in-development.md" + +# Notification Inbox OMVS + +The Notification Inbox Open Metadata View Services (OMVS) is a REST API designed to back user interfaces (UIs) that support notification for a specific user. + +The notifications are defined and managed by the [Stewardship Action OMAS](/services/omas/stewardship-action/overview). + +The Notification Inbox OMVS calls the Stewardship Action OMAS to retrieve the list of user notifications for the calling user. + +Each user notification has a status, summary description and a link to one or more elements that the notification refers to. For example, a notification may indicate that: + +* New data is available for a digital product that the user is watching. +* A new To Do for the user has been created. +* An asynchronous process initiated by the user has finished. + +The user can view the details of the notification, change the status of the notification, or delete it. + + +---8<-- "snippets/abbr.md" + + + + + + diff --git a/site/docs/services/omvs/notification-manager/overview.md b/site/docs/services/omvs/notification-manager/overview.md new file mode 100644 index 0000000000..1e045a1122 --- /dev/null +++ b/site/docs/services/omvs/notification-manager/overview.md @@ -0,0 +1,47 @@ +--- +hide: +- toc +--- + + + + +--8<-- "snippets/content-status/in-development.md" + +# Notification Manager OMVS + +The Notification Manager Open Metadata View Services (OMVS) is a REST API designed to back user interfaces (UIs) that support the control of notifications. These notifications define a specific trigger and the action to take. + +Examples of triggers include: + +* The creation, update or delete of specific metadata elements. +* The creation, update or delete of specific types of metadata elements. +* The detection of an unauthorized user action. +* The completion of a process. +* The production of a particular type of audit log record. + +When the specific trigger occurs, the resulting action could be: + +* To create a user notification +* To create a ToDo for a user +* To initiate a governance action process +* To create an incident report +* To create an event on a specific topic +* To call a remote API + +The notification definitions are defined and managed by the [Stewardship Action OMAS](/services/omas/stewardship-action/overview). + +The Notification Manager OMVS calls the Stewardship Action OMAS to search for, create, update, and delete notification definitions. Once these definitions are in place, the Stewardship Action OMAS begins monitoring for the requested events, and when they occur, it takes the appropriate actions. + + + + + + +---8<-- "snippets/abbr.md" + + + + + + diff --git a/site/docs/services/omvs/project-manager/overview.md b/site/docs/services/omvs/project-manager/overview.md new file mode 100644 index 0000000000..b27b7c29fd --- /dev/null +++ b/site/docs/services/omvs/project-manager/overview.md @@ -0,0 +1,36 @@ +--- +hide: +- toc +--- + + + + +--8<-- "snippets/content-status/in-development.md" + +# Project Manager OMVS + +The Project Manager Open Metadata View Services (OMVS) is a REST API designed to back user interfaces (UIs) that support projects. + +Projects can be organized into a hierarchy and involve many people, or they can be informal, personal projects used by an individual to organize an aspect of their work. In either case, the people and resources necessary to complete the project can be identified. The project's definition includes the expected timeline and objective. + +The Project Manager OMVS supports: + +* The definition of new projects, identifying their scope and timeline. New projects can be created using a project templates. The project templates can be created and maintained through the Project Manager OMVS. +* The linking of related project together. +* The classification of projects that are either a campaign, task or a personal project. +* The appointment of a project team and project manager to the project (if applicable). +* The identification of resources such as digital products and assets that are needed to complete the project. +* The maintenance of project status, actions and meeting notes. + + + + + +---8<-- "snippets/abbr.md" + + + + + + diff --git a/site/docs/types/0/0021-Collections.md b/site/docs/types/0/0021-Collections.md index cd469c9fa6..9acc96baf4 100644 --- a/site/docs/types/0/0021-Collections.md +++ b/site/docs/types/0/0021-Collections.md @@ -3,25 +3,45 @@ # 0021 Collections -*Collection*s provide a general mechanism for grouping entities together. A collection may be maintained manually, or via an automated process (ie a "smart collection"). The membership of a collection is established via a *CollectionMembership* relationship, which has attributes that allow the rationale and the confidence of the membership to be established. +*Collection*s provide a general mechanism for grouping entities together. A collection may be maintained manually, or via an automated process (ie a "smart collection"). The membership of a collection is established via a [*CollectionMembership* relationship](#collectionmembership-relationship), which has attributes that allow the rationale and the confidence of the membership to be established. A [*Referenceable*](/types/0/0010-Base-Model) entity can be a member of none, one or many collections. + +Since a collection is a *Referenceable* entity, collections can be organized into hierarchies - like a directory structure on the filesystem. ![UML](0021-Collections.svg) ## Collection -The *Collection* entity is provides the node that represents the collection as a whole. The members of the collection are linked to it using the *CollectionMembership* relationship. +The *Collection* entity provides the node that represents the collection as a whole. It inherits from [*Referenceable*](/types/0/0010-Base-Model). + +The attributes for a collection, beyond the standard attributes for *Referenceable* include: + +* *name* - this is the display name for the collection +* *description* - this is the text that describes the characteristics of the members that are to be found in the collection. +* *collectionType* - describes the type of collection that is used to select its icon or display layout. For example, it may be a "theme", or "domain", or something else. ## Collection classifications -The classifications associated with *Collection* allow it to be specialized for particular uses. +The classifications associated with *Collection* allow it to be specialized for particular uses. They help when searching for collections for specific uses. -* [*Folder*](#folder-classification) means the collection can be treated as if it where a folder of metadata elements. -* [*Set*](#set-classification) means the collection is a set of related items. +* [*RootCollection*](#root-collection-classification) means the collection is the top-level node in a collection hierarchy. The members of this collection are typically all collections. +* [*Folder*](#folder-classification) means the collection can be treated as if it where a folder of metadata elements. This classification includes properties to control how the members are displayed. +* [*Set*](#set-classification) means the collection is a set of related entities and no entity is a member more than once. +* [*DigitalProduct*](/types/7/0710-Digital-Service) describes a collection of [assets](/concepts/asset) that represent a digital product. * [*GovernanceStatusSet*](/types/4/0421-Governance-Classification-Levels) for a collection of governance statuses. * [*GovernanceClassificationSet*](/types/4/0421-Governance-Classification-Levels) for a collection of governance classification for a particular governance classification. * [*EventSet*](/types/5/0421-Governance-Classification-Levels) for a collection of related event schemas. +The example below shows part of a collection hierarchy representing a digital product catalog. The collections are shown in green and the assets that provide the content for the digital product are shown in yellow. + +The collection at the root of the collection hierarchy is called "Product Catalog Collection" and has the *RootCollection* classification attached. Its membership consists of collections with the *Folder* classification. The leaf node collections have the *DigitalProduct* classification attach and have the data assets as their members. + +![Collection Hierarchy](collection-hierarchy-example.svg) + +### RootCollection classification + +The *RootCollection* classification indicates that the collection is used to provide the starting node for a hierarchy of collections. + ### Folder classification The *Folder* classification indicates that the collection is used to organize metadata elements. The attributes are used to indicate to the caller how they should be displayed. @@ -40,7 +60,7 @@ The *Folder* classification indicates that the collection is used to organize me ### Set classification -The *Set* classification indicates that the collection is a set of related items. +The *Set* classification indicates that the collection is a set of elements where each element is only included in the collection once. ## CollectionMembership relationship diff --git a/site/docs/types/0/0021-Collections.svg b/site/docs/types/0/0021-Collections.svg index f96e34f333..f167f90812 100644 --- a/site/docs/types/0/0021-Collections.svg +++ b/site/docs/types/0/0021-Collections.svg @@ -1,4 +1,4 @@ - + -
0021 - Collections
0021 - Collections
«entity»
Collection
«entity»...
name : string
description : string
name : string...
«classification»
Set
«classification»...
«relationship»
CollectionMembership
«relationship»...
*
*
*
*
«entity»
Referenceable
«entity»...
membershipRationale : string
expression : string
status: MembershipStatus
userDefinedStatus : string
confidence : int
createdBy : string
steward : string
stewardTypeName : string
stewardPropertyName : string
source : string
notes : string
membershipRationale : string...
collectionMembers
collectionMembers
foundInCollections
foundInCollections
«enumeration»
OrderBy
«enumeration»...
NAME = 0
OWNER = 1
DATE_ADDED = 2
DATE_UPDATED = 3
DATE_CREATED = 4
OTHER = 99
NAME = 0...
«classification»
Folder
«classification»...
orderBy : OrderBy
orderPropertyName : string
orderBy : OrderBy...
UNKNOWN=0
DISCOVERED = 1
PROPOSED = 2
IMPORTED = 3
VALIDATED = 4
DEPRECATED = 5
OBSOLETE = 6
OTHER = 99
UNKNOWN=0...
<<enumeration>>
MembershipStatus
<<enumeration>>...
Text is not SVG - cannot display
\ No newline at end of file +
0021 - Collections
0021 - Collections
«entity»
Collection
«entity»...
name : string
description : string
collectionType : string
name : string...
«classification»
RootCollection
«classification»...
«relationship»
CollectionMembership
«relationship»...
*
*
*
*
«entity»
Referenceable
«entity»...
membershipRationale : string
expression : string
status: MembershipStatus
userDefinedStatus : string
confidence : int
createdBy : string
steward : string
stewardTypeName : string
stewardPropertyName : string
source : string
notes : string
membershipRationale : string...
collectionMembers
collectionMembers
foundInCollections
foundInCollections
«enumeration»
OrderBy
«enumeration»...
NAME = 0
OWNER = 1
DATE_ADDED = 2
DATE_UPDATED = 3
DATE_CREATED = 4
OTHER = 99
NAME = 0...
«classification»
Folder
«classification»...
orderBy : OrderBy
orderPropertyName : string
orderBy : OrderBy...
UNKNOWN=0
DISCOVERED = 1
PROPOSED = 2
IMPORTED = 3
VALIDATED = 4
DEPRECATED = 5
OBSOLETE = 6
OTHER = 99
UNKNOWN=0...
<<enumeration>>
MembershipStatus
<<enumeration>>...
«classification»
Set
«classification»...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/site/docs/types/0/area-0-basic-types-and-infrastructure.drawio b/site/docs/types/0/area-0-basic-types-and-infrastructure.drawio index c05df6a732..167eb00cfb 100644 --- a/site/docs/types/0/area-0-basic-types-and-infrastructure.drawio +++ b/site/docs/types/0/area-0-basic-types-and-infrastructure.drawio @@ -1,6 +1,6 @@ - + - + @@ -1353,13 +1353,16 @@ - + + + + @@ -1376,16 +1379,10 @@ - - - - - - - - + + - + @@ -1440,6 +1437,18 @@ + + + + + + + + + + + + @@ -1451,132 +1460,311 @@ - + - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - - - diff --git a/site/docs/types/0/automated-collection.svg b/site/docs/types/0/automated-collection.svg new file mode 100644 index 0000000000..505440bda3 --- /dev/null +++ b/site/docs/types/0/automated-collection.svg @@ -0,0 +1,4 @@ + + + +
Archive Candidate
Collection
Archive Candidate...
Asset
Asset
Asset
Asset
Asset
Asset
CollectionMembership
CollectionMembership
Text is not SVG - cannot display
\ No newline at end of file diff --git a/site/docs/types/0/collection-hierarchy-example.svg b/site/docs/types/0/collection-hierarchy-example.svg new file mode 100644 index 0000000000..0cbff6ee56 --- /dev/null +++ b/site/docs/types/0/collection-hierarchy-example.svg @@ -0,0 +1,4 @@ + + + +
Folder
Folder
Agriculture Insights
Collection
Agriculture Insights...
Folder
Folder
Earth Observation
Satellite Feeds
Earth Observation...
DigitalProduct
DigitalProduct
Landstat 8
Landstat 8
Band 1 
Data Folder
Band 1...
Tiles
Data Folder
Tiles...
RootCollection
RootCollection
Product Catalog
Collection
Product Catalog...
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
CollectionMembership
DigitalProduct
DigitalProduct
Land Use Classification
Land Use Classificat...
CollectionMembership
CollectionMembership
Band 2 
Data Folder
Band 2...
Band 11
Data Folder
Band 11...
DigitalProduct
DigitalProduct
Level-1B
Level-1B
DigitalProduct
DigitalProduct
Level-2A
Level-2A
DigitalProduct
DigitalProduct
Level-1C
Level-1C
Folder
Folder
Sentinel 2
Sentinel 2
Text is not SVG - cannot display
\ No newline at end of file diff --git a/site/docs/types/1/0130-Projects.md b/site/docs/types/1/0130-Projects.md index d2811038c4..9d6d8cade2 100644 --- a/site/docs/types/1/0130-Projects.md +++ b/site/docs/types/1/0130-Projects.md @@ -3,22 +3,58 @@ # 0130 Projects -Projects are used to organize a specific activity. They control the use of resources and associated costs, so they are used appropriately in order to successfully achieve the project's goals. +Projects are used to organize a specific activity. They can control the use of resources and associated costs, so they are used appropriately in order to successfully achieve the project's goals. +Related projects can be organized into campaigns. Small items of work, typically performed by a single person, can be defined as tasks for a project. + +Notice that the project acts as an anchor for collections of resources that the project is using. Since it is a Referenceable, it can have links to external URLs, such as the project home page, project plan or APIs as well as images (see [0015 Linked Media Types](/types/0/0015-Linked-Media-Types) in Area 0). ![UML](0130-Projects.svg) -## Projects +## Project entity +The project entity represents a single project. It inherits from [*Referenceable*](/types/0/0010-Base-Model) and includes attributes for defining the timeframe for the project and its status. +## Campaign classification -Projects organize resources to build new capability or improve existing capability. Related projects can be organized into campaigns. Small items of work, typically performed by a single person, can be defined as tasks for a project. +The *Campaign* classification describes a collection of related projects that are working towards a common goal. Often this goal is a complex transformation that needs actions from independent teams. The definition of the campaign helps to identify the role of the different projects in achieving the common goal, and providing the umbrella for coordinating specific activities as needed. -Notice that the project acts as an anchor for collections of resources that the project is using. Since it is a Referenceable, it can have links to external URLs, such as the project home page, project plan or APIs as well as images (see [0015 Linked Media Types](/types/0/0015-Linked-Media-Types) in Area 0). +A campaign classification is typically attached to either: + +* a [*Collection*](/types/0/0021-Collections) entity whose members are the related projects. +* a [*Project*](#project-entity) entity where the related projects are linked by the [*ProjectHierarchy*](#projecthierarchy-relationship) relationship. + +## Task classification + +The *Task* classification is attached to a *Project* entity to indicate that this entity represents a small piece of work that is typically assigned to a single person (identified via the [*ProjectTeam*](#projectteam-relationship) relationship). Such a task is linked to a parent project via the [*ProjectHierarchy*](#projecthierarchy-relationship) relationship. + +## PersonalProject classification + +The *PersonalProject* classification is attached to a *Project* entity to indicate that this entity represents an informal project that has been created by single person (identified via the [*ProjectTeam*](#projectteam-relationship) relationship) to help organize a part of their work. These projects are typically not linked to into a project hierarchy. They may be linked to other project entities via the [*ProjectDependency*](#projectdependency-relationship) relationship. + +Personal projects do not typically have a [Project Manager](#projectmanagement-relationship) assigned. + +## ProjectHierarchy relationship + +Projects can be broken down into smaller projects that can be executed by different teams on different timelines with different project manager(s) and a specific slice of the budget. The projects that are broken down in this way are linked together using the *ProjectHierarchy* relationship. + +## ProjectDependency relationship + +A project that needs the results of another project to complete its work can be linked to that project via the *ProjectDependency* relationship. + +## ProjectTeam relationship + +The *ProjectTeam* relationship links a project to the [*Actors*](/types/1/0110-Actor) that will perform the work defined by the project. + +## ProjectManagement relationship + +The *ProjectManagement* relationship links a project to the [PersonRole](/types/1/0112-People) entity that will coordinate and track the efforts of the project team. The role in turn links to the individual(s) appointed to perform the role. + +## ProjectManager entity -The description attribute should be used instead of the scopeDescription in ProjectScope; the scopeDescription attribute has been deprecated. +The *ProjectManager* is a specialized [*PersonRole*](/types/1/0112-People) to represent project management responsibilities. It is linked to the project to be managed via the [*ProjectManagement*](#projectmanagement-relationship) relationship. ??? deprecated "Deprecated types" - - *ProjectScope* relationship is deprecated in favour of the more generic [*AssignmentScope*](/types/1/0120-Assignment-Scopes). + - *ProjectScope* relationship is deprecated in favour of the more generic [*AssignmentScope*](/types/1/0120-Assignment-Scopes). The *description* attribute of the *AssignmentScope* relationship should be used instead of the *scopeDescription* in the ProjectScope relationship; the scopeDescription attribute has been deprecated. - *status* attribute on *Project* is deprecated in favour of the more specific *projectStatus* attribute, which makes it easier to align with an appropriate valid value set. --8<-- "snippets/abbr.md" diff --git a/site/docs/types/1/0130-Projects.svg b/site/docs/types/1/0130-Projects.svg index 5f271f3b0e..af1a6a026e 100644 --- a/site/docs/types/1/0130-Projects.svg +++ b/site/docs/types/1/0130-Projects.svg @@ -1,4 +1,4 @@ - + -
0130 - Projects
0130 - Projects
«entity»
Project
«entity»...
identifier : string
name : string
description : string
startDate : date
plannedEndDate : date
projectStatus : string
identifier : string...
«classification»
Task
«classification»...
«entity»
Referenceable
«entity»...
managedProjects
managedProjects
*
*
managingProject
managingProject
0..1
0..1
«relationship»
ProjectHierarchy
«relationship»...
«classification»
Campaign
«classification»...
dependentProjects
dependentProjects
*
*
dependsOnProjects
dependsOnProjects
*
*
«relationship»
ProjectDependency
«relationship»...
dependencySummary : string
dependencySummary : string
«entity»
Actor
«entity»...
«relationship»
ProjectTeam
«relationship»...
teamRole : string
teamRole : string
*
*
*
*
projectFocus
projectFocus
supportingActors
supportingActors
projectsManaged
projectsManaged
*
*
projectManagers
projectManagers
*
*
«relationship»
ProjectManagement
«relationship»...
«entity»
ProjectManager
«entity»...
«entity»
PersonRole
«entity»...
Text is not SVG - cannot display
\ No newline at end of file +
0130 - Projects
0130 - Projects
«entity»
Project
«entity»...
identifier : string
name : string
description : string
startDate : date
plannedEndDate : date
projectStatus : string
identifier : string...
«classification»
Task
«classification»...
«entity»
Referenceable
«entity»...
managedProjects
managedProjects
*
*
managingProject
managingProject
0..1
0..1
«relationship»
ProjectHierarchy
«relationship»...
«classification»
Campaign
«classification»...
dependentProjects
dependentProjects
*
*
dependsOnProjects
dependsOnProjects
*
*
«relationship»
ProjectDependency
«relationship»...
dependencySummary : string
dependencySummary : string
«entity»
Actor
«entity»...
«relationship»
ProjectTeam
«relationship»...
teamRole : string
teamRole : string
*
*
*
*
projectFocus
projectFocus
supportingActors
supportingActors
projectsManaged
projectsManaged
*
*
projectManagers
projectManagers
*
*
«relationship»
ProjectManagement
«relationship»...
«entity»
ProjectManager
«entity»...
«entity»
PersonRole
«entity»...
«classification»
PersonalProject
«classification»...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/site/docs/types/1/area-1-collaboration.drawio b/site/docs/types/1/area-1-collaboration.drawio index 30ff4c3de5..40a5a4b206 100644 --- a/site/docs/types/1/area-1-collaboration.drawio +++ b/site/docs/types/1/area-1-collaboration.drawio @@ -1,6 +1,6 @@ - + - + @@ -633,7 +633,7 @@ - + @@ -819,6 +819,18 @@
+ + + + + + + + + + + + diff --git a/site/docs/types/2/0210-Data-Stores.md b/site/docs/types/2/0210-Data-Stores.md index d3dd511891..57076e7b84 100644 --- a/site/docs/types/2/0210-Data-Stores.md +++ b/site/docs/types/2/0210-Data-Stores.md @@ -19,5 +19,17 @@ The *DataContentForDataSet* relationship defines how data is supplied to a [Data The *DataStoreEncoding* classification provides the ability to store details of the data stores physical characteristics. +## DataScope classification + +The *DataScope* classification identifies the scope of the data stored in the [resource(s)](/concepts/resource) represented by the entity it is attached to. This classification can be attached to any [*Referenceable*](/types/0/0010-Base-Model), but it is typically associated with assets such as *DataStores* and *DataSets*. The attributes of this classification identify the scope of the data in space and time. + +* *minLongitude* - if the data is bound by an area, this is the longitude for bottom-left corner of the bounding box (BBOX) for the area covered by the data. +* *minLatitude* - if the data is bound by an area, this is the latitude for the bottom-left corner of the bounding box (BBOX) for the area covered by the data. +* *maxLongitude* - if the data is bound by an area, this is the longitude for top-right corner of the bounding box (BBOX) for the area covered by the data. +* *maxLatitude* - if the data is bound by an area, this is the latitude for top-right corner of the bounding box (BBOX) for the area covered by the data. +* *minHeight* - if the height above ground is relevant, this is the lowest height that the data covers. +* *maxHeight* - if the height above ground is relevant, this is the highest height that the data covers. +* *startTime* - if the data is bound by time, this is the start time. +* *endTime* - if the data is bound by time, this is the end time. --8<-- "snippets/abbr.md" \ No newline at end of file diff --git a/site/docs/types/2/0210-Data-Stores.svg b/site/docs/types/2/0210-Data-Stores.svg index a4d1ebd95e..3610b77c75 100644 --- a/site/docs/types/2/0210-Data-Stores.svg +++ b/site/docs/types/2/0210-Data-Stores.svg @@ -1,4 +1,4 @@ -
0210 - Data Stores
0210 - Data Stores
«entity»
DataStore
«entity»...
«entity»
Asset
«entity»...
«entity»
DataSet
«entity»...
*
*
dataContent
dataContent
supportedDataSets
supportedDataSets
*
*
queryId : string
query : string
queryId : string...
«relationship»
DataContentForDataSet
«relationship»...
encoding : string
language : string
description : string
properties : map<string, string>
encoding : string...
«classification»
DataStoreEncoding
«classification»...
storeCreateTime : date
storeUpdateTime : date
pathName : string
deployedImplementationType : string
storeCreateTime : date...
Text is not SVG - cannot display
\ No newline at end of file +
0210 - Data Stores
0210 - Data Stores
«entity»
DataStore
«entity»...
«entity»
Asset
«entity»...
«entity»
DataSet
«entity»...
*
*
dataContent
dataContent
supportedDataSets
supportedDataSets
*
*
queryId : string
query : string
queryId : string...
«relationship»
DataContentForDataSet
«relationship»...
encoding : string
language : string
description : string
properties : map<string, string>
encoding : string...
«classification»
DataStoreEncoding
«classification»...
storeCreateTime : date
storeUpdateTime : date
pathName : string
deployedImplementationType : string
storeCreateTime : date...
«entity»
Referenceable
«entity»...
minLongitude : float
minLatitude : float
maxLongitude : float
maxLatitude : float
minHeight : float
maxHeight : float
startTime : date
endTime : date
minLongitude : float...
«classification»
DataScope
«classification»...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/site/docs/types/2/area-2-assets.drawio b/site/docs/types/2/area-2-assets.drawio index 300b1dfcc9..096f16e7d3 100644 --- a/site/docs/types/2/area-2-assets.drawio +++ b/site/docs/types/2/area-2-assets.drawio @@ -1,6 +1,6 @@ - + - + @@ -152,7 +152,7 @@ - + @@ -440,7 +440,7 @@ - + @@ -538,7 +538,7 @@ - + @@ -602,6 +602,27 @@ + + + + + + + + + + + + + + + + + + + + +