diff --git a/README.md b/README.md index d871d59ed933f23b121814e623028da44883fd60..e5752548dd61bde8474ae53fc89153cf00051751 100644 --- a/README.md +++ b/README.md @@ -859,4 +859,27 @@ into a filter expression, for example `org.eclipse.edc.vc.type:DataProcessorCred query for `DataProcessorCredentials` in the database. The MVD uses the default `EdcScopeToCriterionTransformer` to achieve this. It is recommended to implement a custom -`ScopeToCriterionTransformer` for an actual production scenario. \ No newline at end of file +`ScopeToCriterionTransformer` for an actual production scenario. + +## Use Minikube as Alternative to KinD + +Build the docker images as described above (section 5.1). Then, instead of +moving on to section 5.2, do the following: + +0. `alias minikube='minikube -p mvd'` +1. `alias kubectl='minikube kubectl --'` +2. `minikube start` +3. `minikube addons enable ingress` +4. Wait for the ingress controller to become available: + ``` + kubectl wait --namespace ingress-nginx \ + --for=condition=ready pod \ + --selector=app.kubernetes.io/component=controller \ + --timeout=90s + ``` +5. Forward the local port 80 to the ingress controller: + `sudo ssh -i $(minikube ssh-key) docker@$(minikube ip) -L 80:localhost:80` +6. Load the images: + `minikube image load controlplane:latest dataplane:latest identity-hub:latest catalog-server:latest sts:latest` + +Now you can go on with starting the pods with `terraform init`, `terraform apply` etc. (see above, section 5.2). diff --git a/deployment/modules/linkahead/ingress.tf b/deployment/modules/linkahead/ingress.tf new file mode 100644 index 0000000000000000000000000000000000000000..1a90f49451a0a69256881e5ee585715f24b68d75 --- /dev/null +++ b/deployment/modules/linkahead/ingress.tf @@ -0,0 +1,29 @@ +resource "kubernetes_ingress_v1" "linkahead-ingress" { + metadata { + name = "${var.instance-name}-ingress" + namespace = var.namespace + annotations = { + #"nginx.ingress.kubernetes.io/rewrite-target" = "/$2" + "nginx.ingress.kubernetes.io/use-regex" = "true" + #"nginx.ingress.kubernetes.io/ssl-passthrough" = "true" + } + } + spec { + ingress_class_name = "nginx" + rule { + http { + path { + path = "/${var.instance-name}/linkahead(/|$)(.*)" + backend { + service { + name = kubernetes_service.linkahead-service.metadata.0.name + port { + number = var.linkahead-port + } + } + } + } + } + } + } +} diff --git a/deployment/modules/linkahead/main.tf b/deployment/modules/linkahead/main.tf new file mode 100644 index 0000000000000000000000000000000000000000..ec1dd3386499072bec5f2744b346a5e6e62bfc5a --- /dev/null +++ b/deployment/modules/linkahead/main.tf @@ -0,0 +1,121 @@ +resource "kubernetes_deployment" "linkahead" { + metadata { + name = local.app-name + namespace = var.namespace + labels = { + App = local.app-name + } + } + + spec { + replicas = 1 + selector { + match_labels = { + App = local.app-name + } + } + template { + metadata { + labels = { + App = local.app-name + } + } + spec { + container { + image = local.linkahead-image + name = local.app-name + + env_from { + config_map_ref { + name = kubernetes_config_map.linkahead-env.metadata[0].name + } + } + port { + container_port = 10080 + name = "linkahead-port" + } + + # dynamic "volume_mount" { + # for_each = toset(var.init-sql-configs) + # content { + # mount_path = "/docker-entrypoint-initdb.d/${volume_mount.value}.sql" + # name = volume_mount.value + # sub_path = "${volume_mount.value}.sql" + # read_only = true + # } + # } + + # Uncomment this to assign (more) resources + # resources { + # limits = { + # cpu = "2" + # memory = "512Mi" + # } + # requests = { + # cpu = "250m" + # memory = "50Mi" + # } + # } + liveness_probe { + tcp_socket { + port = var.linkahead-port + } + failure_threshold = 10 + period_seconds = 5 + timeout_seconds = 30 + } + } + + # dynamic "volume" { + # for_each = toset(var.init-sql-configs) + # content { + # name = volume.value + # config_map { + # name = volume.value + # } + # } + # } + } + } + } +} + +resource "kubernetes_config_map" "linkahead-env" { + metadata { + name = "${local.app-name}-env" + namespace = var.namespace + } + + data = { + CAOSDB_CONFIG_AUTH_OPTIONAL = "TRUE" + CAOSDB_CONFIG_MYSQL_HOST = local.mariadb-host + CAOSDB_CONFIG_MYSQL_PORT = local.mariadb-port + CAOSDB_CONFIG_CONTEXT_ROOT = "/${var.instance-name}/linkahead" + NO_TLS = "1" + DEBUG = "1" + } +} + +resource "kubernetes_service" "linkahead-service" { + metadata { + name = "${local.app-name}-service" + namespace = var.namespace + } + spec { + selector = { + App = kubernetes_deployment.linkahead.spec.0.template.0.metadata[0].labels.App + } + port { + name = "linkahead-port" + port = var.linkahead-port + target_port = 10080 + } + } +} + +locals { + mariadb-host = "${var.instance-name}-mariadb-service" + mariadb-port = 3306 + app-name = "${var.instance-name}-linkahead" + linkahead-image = "indiscale/linkahead:dev" +} diff --git a/deployment/modules/linkahead/variables.tf b/deployment/modules/linkahead/variables.tf new file mode 100644 index 0000000000000000000000000000000000000000..b7cae0313522b8c4a8709e89943b1653d4b75a3e --- /dev/null +++ b/deployment/modules/linkahead/variables.tf @@ -0,0 +1,25 @@ +# +# Copyright (c) 2024 Metaform Systems, Inc. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License, Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# +# Contributors: +# Metaform Systems, Inc. - initial API and implementation +# + +variable "instance-name" { + description = "Unique name for the LinkAhead instance" +} + +variable "namespace" { + description = "kubernetes namespace where the LinkAhead instance is deployed" +} + +variable "linkahead-port" { + description = "Linkahead http port" + default = 10080 +} diff --git a/deployment/modules/mariadb/main.tf b/deployment/modules/mariadb/main.tf new file mode 100644 index 0000000000000000000000000000000000000000..a8beb3bffc1dd564d4d09b5dc6a54b753aca7cf7 --- /dev/null +++ b/deployment/modules/mariadb/main.tf @@ -0,0 +1,117 @@ +resource "kubernetes_deployment" "mariadb" { + metadata { + name = local.app-name + namespace = var.namespace + labels = { + App = local.app-name + } + } + + spec { + replicas = 1 + selector { + match_labels = { + App = local.app-name + } + } + template { + metadata { + labels = { + App = local.app-name + } + } + spec { + container { + image = local.mariadb-image + name = local.app-name + + env_from { + config_map_ref { + name = kubernetes_config_map.mariadb-env.metadata[0].name + } + } + port { + container_port = 3306 + name = "mariadb-port" + } + + # dynamic "volume_mount" { + # for_each = toset(var.init-sql-configs) + # content { + # mount_path = "/docker-entrypoint-initdb.d/${volume_mount.value}.sql" + # name = volume_mount.value + # sub_path = "${volume_mount.value}.sql" + # read_only = true + # } + # } + + # Uncomment this to assign (more) resources + # resources { + # limits = { + # cpu = "2" + # memory = "512Mi" + # } + # requests = { + # cpu = "250m" + # memory = "50Mi" + # } + # } + liveness_probe { + tcp_socket { + port = 3306 + } + failure_threshold = 10 + period_seconds = 5 + timeout_seconds = 30 + } + } + + # dynamic "volume" { + # for_each = toset(var.init-sql-configs) + # content { + # name = volume.value + # config_map { + # name = volume.value + # } + # } + # } + } + } + } +} + +resource "kubernetes_config_map" "mariadb-env" { + metadata { + name = "${local.app-name}-env" + namespace = var.namespace + } + + data = { + MYSQL_ROOT_PASSWORD = "caosdb1234" + } +} + +resource "kubernetes_service" "mariadb-service" { + metadata { + name = "${local.app-name}-service" + namespace = var.namespace + } + spec { + selector = { + App = kubernetes_deployment.mariadb.spec.0.template.0.metadata[0].labels.App + } + port { + name = "mariadb-port" + port = var.database-port + target_port = var.database-port + } + } +} + +locals { + app-name = "${var.instance-name}-mariadb" + mariadb-image = "mariadb:10.11" + db-ip = kubernetes_service.mariadb-service.spec.0.cluster_ip + db-url = "${kubernetes_service.mariadb-service.metadata[0].name}:${var.database-port}" + db-host = kubernetes_service.mariadb-service.metadata[0].name +} diff --git a/deployment/modules/mariadb/outputs.tf b/deployment/modules/mariadb/outputs.tf new file mode 100644 index 0000000000000000000000000000000000000000..3d5bc5dfb730c00f86f165c619175afeda86538d --- /dev/null +++ b/deployment/modules/mariadb/outputs.tf @@ -0,0 +1,32 @@ +# +# Copyright (c) 2024 Metaform Systems, Inc. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License, Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# +# Contributors: +# Metaform Systems, Inc. - initial API and implementation +# + +output "instance-name" { + value = var.instance-name +} + +output "database-port" { + value = var.database-port +} + +output "database-url" { + value = local.db-url +} + +output "database-host" { + value = local.db-host +} + +output "database-ip" { + value = local.db-ip +} diff --git a/deployment/modules/mariadb/variables.tf b/deployment/modules/mariadb/variables.tf new file mode 100644 index 0000000000000000000000000000000000000000..aae317db5664f9e17099677e7dd6b79da79bf460 --- /dev/null +++ b/deployment/modules/mariadb/variables.tf @@ -0,0 +1,29 @@ +# +# Copyright (c) 2024 Metaform Systems, Inc. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License, Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# +# Contributors: +# Metaform Systems, Inc. - initial API and implementation +# + +variable "instance-name" { + description = "Unique name for the Mariadb instance" +} + +variable "database-port" { + default = 3306 +} + +variable "init-sql-configs" { + description = "Name of config maps with init sql scripts" + default = [] +} + +variable "namespace" { + description = "kubernetes namespace where the Mariadb instance is deployed" +} diff --git a/deployment/outputs.tf b/deployment/outputs.tf index 6d848a95fd5372dd387fb960d4cf42ccf01ba36a..2b7c1ec319fdb4ca9cad90f67f8ca84b8a5e06a8 100644 --- a/deployment/outputs.tf +++ b/deployment/outputs.tf @@ -28,4 +28,12 @@ output "provider-jdbc-url" { provider-qna = "jdbc:postgresql://${module.provider-postgres.database-url}/provider_qna" provider-manufacturing = "jdbc:postgresql://${module.provider-postgres.database-url}/provider_manufacturing" } -} \ No newline at end of file +} + +output "provider-mariadb" { + value = { + host = module.provider-mariadb.database-host + port = module.provider-mariadb.database-port + ip = module.provider-mariadb.database-ip + } +} diff --git a/deployment/provider.tf b/deployment/provider.tf index f04d6aaa6a2115c4cb8af792b380c1bdd3492dd6..023922fa98e14b485d63431b98529a1be696b69c 100644 --- a/deployment/provider.tf +++ b/deployment/provider.tf @@ -99,7 +99,20 @@ module "provider-vault" { namespace = kubernetes_namespace.ns.metadata.0.name } -# Postgres database for the consumer +# Mariadb database for provider linkahead +module "provider-mariadb" { + source = "./modules/mariadb" + instance-name = "provider" + namespace = kubernetes_namespace.ns.metadata.0.name +} + +module "provider-linkahead" { + source = "./modules/linkahead" + instance-name = "provider" + namespace = kubernetes_namespace.ns.metadata.0.name +} + +# Postgres database for the provider module "provider-postgres" { depends_on = [kubernetes_config_map.postgres-initdb-config-cs] source = "./modules/postgres" @@ -170,4 +183,4 @@ resource "kubernetes_config_map" "postgres-initdb-config-ih" { \c identity EOT } -} \ No newline at end of file +}