From 1afbd9ff06c788c4d1a5079d7b0cb929b45bc395 Mon Sep 17 00:00:00 2001 From: SoTrx <11771975+SoTrx@users.noreply.github.com> Date: Fri, 27 Sep 2024 01:52:24 +0200 Subject: [PATCH] Add Applications.Dapr/configurationStores local-dev recipe (#75) * Add Applications.Dapr/ConfigurationStores local-dev recipe Signed-off-by: SoTrxII <11771975+SoTrx@users.noreply.github.com> * Adding new configurationstores recipe to readme Signed-off-by: SoTrxII <11771975+SoTrx@users.noreply.github.com> --------- Signed-off-by: SoTrxII <11771975+SoTrx@users.noreply.github.com> --- local-dev/README.md | 1 + local-dev/configurationstores.bicep | 139 ++++++++++++++++++++++++++++ tests/test-local-dev-recipes.bicep | 19 ++++ 3 files changed, 159 insertions(+) create mode 100644 local-dev/configurationstores.bicep diff --git a/local-dev/README.md b/local-dev/README.md index e3f4fdb..3c3ccf4 100644 --- a/local-dev/README.md +++ b/local-dev/README.md @@ -6,6 +6,7 @@ The [local-dev](/local-dev) directory contains lightweight Recipes for developme | Recipe | Resource | Description | Template Path | |--------|----------|-------------|---------------| +| [`local-dev/daprconfigurationstores`](/local-dev/configurationstores.bicep) | `Applications.Dapr/configurationStores` | A lightweight container running the `redis` image and a Redis Dapr Configuration Store component for development purposes. | `ghcr.io/radius-project/recipes/local-dev/daprconfigurationstores:TAG` | | [`local-dev/daprpubsubbrokers`](/local-dev/pubsubbrokers.bicep) | `Applications.Dapr/pubSubBrokers` | A lightweight container running the `redis` image and a Redis Dapr Pub/Sub component for development purposes. | `ghcr.io/radius-project/recipes/local-dev/daprpubsubbrokers:TAG` | | [`local-dev/daprstatestores`](/local-dev/statestores.bicep) | `Applications.Dapr/stateStores` |A lightweight container running the `redis` image and a Redis Dapr state store component for development purposes. | `ghcr.io/radius-project/recipes/local-dev/daprstatestores:TAG` | | [`local-dev/secretStores`](/local-dev/secretstores.bicep) | `Applications.Dapr/secretStores` | A kubernetes secret store type for development purposes. | `ghcr.io/radius-project/recipes/local-dev/secretstores:TAG` | diff --git a/local-dev/configurationstores.bicep b/local-dev/configurationstores.bicep new file mode 100644 index 0000000..da2452e --- /dev/null +++ b/local-dev/configurationstores.bicep @@ -0,0 +1,139 @@ +/* +Copyright 2023 The Radius Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +@description('Information about what resource is calling this Recipe. Generated by Radius. For more information visit https://docs.radapp.dev/operations/custom-recipes/') +param context object + +@description('Tag to pull for the redis container image.') +param tag string = '7' + +@description('Memory request for the redis deployment.') +param memoryRequest string = '128Mi' + +@description('Memory limit for the redis deployment') +param memoryLimit string = '1024Mi' + +extension kubernetes with { + kubeConfig: '' + namespace: context.runtime.kubernetes.namespace +} as kubernetes + +var uniqueName = 'daprconfig-${uniqueString(context.resource.id)}' +var port = 6379 + +resource redis 'apps/Deployment@v1' = { + metadata: { + name: uniqueName + } + spec: { + selector: { + matchLabels: { + app: 'dapr-config-redis' + resource: context.resource.name + } + } + template: { + metadata: { + labels: { + app: 'dapr-config-redis' + resource: context.resource.name + + // Label pods with the application name so `rad run` can find the logs. + 'radapp.io/application': context.application == null ? '' : context.application.name + } + } + spec: { + containers: [ + { + // This container is the running redis instance. + name: 'redis' + image: 'redis:${tag}' + ports: [ + { + containerPort: port + } + ] + resources: { + requests: { + memory: memoryRequest + } + limits: { + memory: memoryLimit + } + } + } + ] + } + } + } +} + +resource svc 'core/Service@v1' = { + metadata: { + name: uniqueName + } + spec: { + type: 'ClusterIP' + selector: { + app: 'dapr-config-redis' + resource: context.resource.name + } + ports: [ + { + port: port + } + ] + } +} + +var daprType = 'configuration.redis' +var daprVersion = 'v1' + +resource daprComponent 'dapr.io/Component@v1alpha1' = { + metadata: { + name: context.resource.name + } + spec: { + type: daprType + version: daprVersion + metadata: [ + { + name: 'redisHost' + value: '${svc.metadata.name}.${svc.metadata.namespace}.svc.cluster.local:${port}' + } + { + name: 'redisPassword' + value: '' + } + ] + } +} + +output result object = { + // This workaround is needed because the deployment engine omits Kubernetes resources from its output. + // This allows Kubernetes resources to be cleaned up when the resource is deleted. + // Once this gap is addressed, users won't need to do this. + resources: [ + '/planes/kubernetes/local/namespaces/${svc.metadata.namespace}/providers/core/Service/${svc.metadata.name}' + '/planes/kubernetes/local/namespaces/${redis.metadata.namespace}/providers/apps/Deployment/${redis.metadata.name}' + '/planes/kubernetes/local/namespaces/${daprComponent.metadata.namespace}/providers/dapr.io/Component/${daprComponent.metadata.name}' + ] + values: { + type: daprType + version: daprVersion + metadata: daprComponent.spec.metadata + } +} diff --git a/tests/test-local-dev-recipes.bicep b/tests/test-local-dev-recipes.bicep index 01649b4..a6b16bf 100644 --- a/tests/test-local-dev-recipes.bicep +++ b/tests/test-local-dev-recipes.bicep @@ -73,6 +73,13 @@ resource env 'Applications.Core/environments@2023-10-01-preview' = { templatePath: '${registry}/recipes/local-dev/statestores:${version}' } } + 'Applications.Dapr/configurationStores': { + default: { + templateKind: 'bicep' + plainHttp: true + templatePath: '${registry}/recipes/local-dev/configurationstores:${version}' + } + } } } } @@ -119,6 +126,9 @@ resource webapp 'Applications.Core/containers@2023-10-01-preview' = { daprstatestore: { source: statestore.id } + daprconfigurationstore: { + source: configurationstore.id + } } container: { image: magpieimage @@ -205,3 +215,12 @@ resource statestore 'Applications.Dapr/stateStores@2023-10-01-preview' = { environment: env.id } } + +resource configurationstore 'Applications.Dapr/configurationStores@2023-10-01-preview' = { + name: 'dapr-dcs-recipe' + properties: { + application: app.id + environment: env.id + } +} +