From fb81827eb68b86234deeb727d83e3acdb0425efb Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Fri, 13 Oct 2023 13:16:21 -0400 Subject: [PATCH 01/52] Merge edge to v0.26 (#838) * Add how-to guide on local dev recipes (#822) * Add supported resource types * Add how-to guideto use local dev recipes * Apply suggestions from code review Co-authored-by: Jonathan Smith * Update docs/content/guides/recipes/howto-dev-recipes/index.md * Adddress feedback * Address feedback * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Minor tweaks * minor tweaks --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis * Standardize pre-reqs for all how-tos (#836) * Standardixe pre-reqs for all how-tos * Update docs/content/guides/author-apps/azure/howto-azure-resources/index.md --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis --- .../azure/howto-azure-resources/index.md | 5 +- .../howto-connect-dependencies/index.md | 3 +- .../containers/howto-keyvault-volume/index.md | 3 +- .../containers/howto-volumes/index.md | 5 +- .../networking/howto-gateways/index.md | 5 +- .../howto-service-networking/index.md | 5 +- .../author-apps/networking/howto-tls/index.md | 5 +- .../environments/howto-environment/index.md | 5 +- .../howto-deploy/howto-deploy-cicd/index.md | 2 +- .../control-plane/howto-postman/index.md | 2 +- .../control-plane/logs/fluentd/index.md | 2 +- .../groups/howto-resourcegroups/index.md | 2 +- .../providers/howto-aws-provider/index.md | 1 + .../providers/howto-azure-provider/index.md | 1 + .../workspaces/howto-workspaces/index.md | 5 + .../recipes/howto-author-recipes/index.md | 4 +- .../guides/recipes/howto-dev-recipes/index.md | 112 ++++++++++++++++++ .../howto-dev-recipes/snippets/app.bicep | 33 ++++++ docs/content/guides/recipes/overview/index.md | 2 +- docs/content/tutorials/tutorial-dapr/index.md | 9 +- .../tutorials/tutorial-recipe/index.md | 5 +- .../install-radius/initialize-radius.md | 11 ++ 22 files changed, 199 insertions(+), 28 deletions(-) create mode 100644 docs/content/guides/recipes/howto-dev-recipes/index.md create mode 100644 docs/content/guides/recipes/howto-dev-recipes/snippets/app.bicep diff --git a/docs/content/guides/author-apps/azure/howto-azure-resources/index.md b/docs/content/guides/author-apps/azure/howto-azure-resources/index.md index 7e3b5e11e..24394af4a 100644 --- a/docs/content/guides/author-apps/azure/howto-azure-resources/index.md +++ b/docs/content/guides/author-apps/azure/howto-azure-resources/index.md @@ -19,8 +19,9 @@ The steps below will showcase a "rad-ified" version of the existing [Azure AD wo ## Prerequisites -- [rad CLI]({{< ref getting-started >}}) installed on your machine -- [Supported Kubernetes cluster]({{< ref "guides/operations/kubernetes" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/installation.html) installed in your cluster ## Step 1: Initialize Radius diff --git a/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md b/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md index d9875dc44..8837a3d28 100644 --- a/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md +++ b/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md @@ -12,7 +12,8 @@ This how-to guide will teach how to connect to your dependencies via [connection ## Prerequisites -- [Radius CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) - [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) ## Step 1: View the container definition diff --git a/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md b/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md index bb9808334..d5d1d4e5a 100644 --- a/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md +++ b/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md @@ -18,7 +18,8 @@ This how-to guide will provide an overview of how to: ## Prerequisites -- [rad CLI]({{< ref getting-started >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) - [Supported Kubernetes cluster]({{< ref "guides/operations/kubernetes" >}}) - [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/installation.html) installed on your cluster - [Azure Keyvault Provider](https://azure.github.io/secrets-store-csi-driver-provider-azure/docs/getting-started/installation/) diff --git a/docs/content/guides/author-apps/containers/howto-volumes/index.md b/docs/content/guides/author-apps/containers/howto-volumes/index.md index 53d6434ed..c2bb14853 100644 --- a/docs/content/guides/author-apps/containers/howto-volumes/index.md +++ b/docs/content/guides/author-apps/containers/howto-volumes/index.md @@ -15,8 +15,9 @@ This how-to guide will provide an overview of how to: ## Prerequisites -- [rad CLI]({{< ref getting-started >}}) -- [Radius Environment]({{< ref "/guides/deploy-apps/environments/overview" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) ## Step 1: Define an app and a container diff --git a/docs/content/guides/author-apps/networking/howto-gateways/index.md b/docs/content/guides/author-apps/networking/howto-gateways/index.md index 53ab87eee..f6165b4b8 100644 --- a/docs/content/guides/author-apps/networking/howto-gateways/index.md +++ b/docs/content/guides/author-apps/networking/howto-gateways/index.md @@ -12,8 +12,9 @@ This guide will walk you through how to setup a gateway for routing internet tra ## Prerequisites -- [rad CLI]({{< ref "/guides/tooling/rad-cli/overview" >}}) -- [Radius environment]({{< ref "getting-started" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) ## Step 1: Define a container diff --git a/docs/content/guides/author-apps/networking/howto-service-networking/index.md b/docs/content/guides/author-apps/networking/howto-service-networking/index.md index 4a90860a2..ba0cb8ab4 100644 --- a/docs/content/guides/author-apps/networking/howto-service-networking/index.md +++ b/docs/content/guides/author-apps/networking/howto-service-networking/index.md @@ -14,8 +14,9 @@ This guide will show you how two services can communicate with each other. In th ## Prerequisites -- [rad CLI]({{< ref "/guides/tooling/rad-cli/overview" >}}) -- [Radius environment]({{< ref getting-started >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) ## Step 1: Define the services diff --git a/docs/content/guides/author-apps/networking/howto-tls/index.md b/docs/content/guides/author-apps/networking/howto-tls/index.md index 9b67eea2f..de03cbf68 100644 --- a/docs/content/guides/author-apps/networking/howto-tls/index.md +++ b/docs/content/guides/author-apps/networking/howto-tls/index.md @@ -12,8 +12,9 @@ This guide will show you how to add TLS and HTTPS to an application with a gatew ## Prerequisites -- [rad CLI]({{< ref getting-started >}}) -- [Radius environment]({{< ref getting-started >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) - Domain name + DNS A-record pointing to your Kubernetes cluster - If running Radius on an Azure Kubernetes Service (AKS) cluster you can optionally use a [DNS label](https://learn.microsoft.com/azure/virtual-network/ip-services/public-ip-addresses#dns-name-label) to create a DNS A-record pointing to your cluster. - If running Radius on an Elastic Kubernetes Service (EKS) cluster you can optionally leverage an [Application Load Balancer](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) for a hosted DNS name and record. diff --git a/docs/content/guides/deploy-apps/environments/howto-environment/index.md b/docs/content/guides/deploy-apps/environments/howto-environment/index.md index 3fb961291..c8189364a 100644 --- a/docs/content/guides/deploy-apps/environments/howto-environment/index.md +++ b/docs/content/guides/deploy-apps/environments/howto-environment/index.md @@ -14,8 +14,9 @@ Radius Environments can be setup with the rad CLI via two paths: interactive or ## Pre-requisites -- Install the [rad CLI]({{< ref getting-started >}}) -- Setup a supported [Kubernetes cluster]({{< ref "guides/operations/kubernetes" >}}) +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) ## Create a development environment diff --git a/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md b/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md index 556e2ebf9..015451140 100644 --- a/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md +++ b/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md @@ -12,7 +12,7 @@ It's easy to get Radius added to your GitHub Actions deployment pipelines. By le ## Prerequisites -- Kubernetes cluster (AKS, EKS, GKE, etc.) +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - Radius control plane [installed in your cluster]({{< ref kubernetes-install >}}) - GitHub repo with Actions enabled diff --git a/docs/content/guides/operations/control-plane/howto-postman/index.md b/docs/content/guides/operations/control-plane/howto-postman/index.md index 065fb3232..96aafa88c 100644 --- a/docs/content/guides/operations/control-plane/howto-postman/index.md +++ b/docs/content/guides/operations/control-plane/howto-postman/index.md @@ -16,7 +16,7 @@ Before you get started, you'll need to make sure you have the following tools an - [Postman](https://www.postman.com/) - [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -- [Radius initialized with `rad init`](https://docs.radapp.dev/getting-started/) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) ### Step 1: Create Kubernetes objects diff --git a/docs/content/guides/operations/control-plane/logs/fluentd/index.md b/docs/content/guides/operations/control-plane/logs/fluentd/index.md index 8babf8e80..0de7ea463 100644 --- a/docs/content/guides/operations/control-plane/logs/fluentd/index.md +++ b/docs/content/guides/operations/control-plane/logs/fluentd/index.md @@ -10,7 +10,7 @@ tags: ["logs","observability"] ## Prerequisites -- [Supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - [kubectl](https://kubernetes.io/docs/tasks/tools/) - [Helm 3](https://helm.sh/) diff --git a/docs/content/guides/operations/groups/howto-resourcegroups/index.md b/docs/content/guides/operations/groups/howto-resourcegroups/index.md index 9ebac615b..2f870c40c 100644 --- a/docs/content/guides/operations/groups/howto-resourcegroups/index.md +++ b/docs/content/guides/operations/groups/howto-resourcegroups/index.md @@ -12,7 +12,7 @@ This guide will walk you through the process of managing resource groups in Radi ## Pre-requisites - [Supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) -- [Radius CLI]({{< ref howto-rad-cli >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) ## Step 1: Ensure Radius is installed diff --git a/docs/content/guides/operations/providers/howto-aws-provider/index.md b/docs/content/guides/operations/providers/howto-aws-provider/index.md index e96a1e89d..cc0b7846b 100644 --- a/docs/content/guides/operations/providers/howto-aws-provider/index.md +++ b/docs/content/guides/operations/providers/howto-aws-provider/index.md @@ -17,6 +17,7 @@ The AWS provider allows you to deploy and connect to AWS resources from a Radius - [EKS cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - [AWS account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account) and an [IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html) - [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) ## Interactive configuration diff --git a/docs/content/guides/operations/providers/howto-azure-provider/index.md b/docs/content/guides/operations/providers/howto-azure-provider/index.md index 6bdf31073..e1a62e13f 100644 --- a/docs/content/guides/operations/providers/howto-azure-provider/index.md +++ b/docs/content/guides/operations/providers/howto-azure-provider/index.md @@ -16,6 +16,7 @@ The Azure provider allows you to deploy and connect to Azure resources from a se - [Azure subscription](https://azure.com) - [az CLI](https://aka.ms/azcli) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) ## Interactive configuration diff --git a/docs/content/guides/operations/workspaces/howto-workspaces/index.md b/docs/content/guides/operations/workspaces/howto-workspaces/index.md index 4b37c9e6d..ebc6802e8 100644 --- a/docs/content/guides/operations/workspaces/howto-workspaces/index.md +++ b/docs/content/guides/operations/workspaces/howto-workspaces/index.md @@ -7,6 +7,11 @@ weight: 300 categories: "How-To" --- +## Pre-requisites + +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) + ## How-to: Use workspaces to switch between environments When you have multiple environments initialized for different purposes workspaces enable you to switch between different environments easily. You can create separate workspaces and switch between them as you are working through your deployment lifecycle. diff --git a/docs/content/guides/recipes/howto-author-recipes/index.md b/docs/content/guides/recipes/howto-author-recipes/index.md index 12ccea392..d09e58168 100644 --- a/docs/content/guides/recipes/howto-author-recipes/index.md +++ b/docs/content/guides/recipes/howto-author-recipes/index.md @@ -12,8 +12,10 @@ tags: ["recipes"] Before you get started, you'll need to make sure you have the following tools and resources: +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) - [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -- [Radius initialized with `rad init`]({{< ref getting-started >}}) ### Step 1: Author a Recipe template diff --git a/docs/content/guides/recipes/howto-dev-recipes/index.md b/docs/content/guides/recipes/howto-dev-recipes/index.md new file mode 100644 index 000000000..a8fdf74d4 --- /dev/null +++ b/docs/content/guides/recipes/howto-dev-recipes/index.md @@ -0,0 +1,112 @@ +--- +type: docs +title: "How-To: Use local-dev Recipes" +linkTitle: "local-dev Recipes" +description: "Learn how to use the pre-defined Recipes that makes it easy to run dependencies in your application." +weight: 200 +categories: "How-To" +tags: ["recipes"] +--- + +Local development environments created by the rad init command include a set of pre-defined Recipes called [`local-dev` Recipes]({{< ref "guides/recipes/overview##use-lightweight-local-dev-recipes" >}}), to get lightweight containerized infrastructure up and running quickly. This guide teaches how to use a local dev recipe to deploy a Redis container to a Kubernetes cluster. + +## Prerequisites + +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) + +## Step 1: Initialize a Radius environment + +1. Begin in a new directory for your application: + + ```bash + mkdir recipes + cd recipes + ``` +2. Initialize a new dev environment: + + ```bash + rad init + ``` + + **Select 'No' when prompted to create an application.** + +3. Use [`rad recipe list`]({{< ref rad_recipe_list >}}) to view the Recipes in your environment: + + ```bash + rad recipe list + ``` + + You should see a table of available Recipes: + + ``` + NAME TYPE TEMPLATE KIND TEMPLATE VERSION TEMPLATE + default Applications.Datastores/sqlDatabases bicep radius.azurecr.io/recipes/local-dev/sqldatabases:latest + default Applications.Messaging/rabbitMQQueues bicep radius.azurecr.io/recipes/local-dev/rabbitmqqueues:latest + default Applications.Dapr/pubSubBrokers bicep radius.azurecr.io/recipes/local-dev/pubsubbrokers:latest + default Applications.Dapr/secretStores bicep radius.azurecr.io/recipes/local-dev/secretstores:latest + default Applications.Dapr/stateStores bicep radius.azurecr.io/recipes/local-dev/statestores:latest + default Applications.Datastores/mongoDatabases bicep radius.azurecr.io/recipes/local-dev/mongodatabases:latest + default Applications.Datastores/redisCaches bicep radius.azurecr.io/recipes/local-dev/rediscaches:latest + ``` + > Visit the [Recipes repo](https://github.com/radius-project/recipes) to learn more about the definition of these `local-dev` recipe templates. + + When a Recipe is named "default" it will be used automatically when a resource doesn't specify a Recipe name. This makes it easy for applications to fully defer to the Environment for how to manage infrastructure. + +## Step 2: Define your application + +Create a file named `app.bicep` with the following set of resources: + +{{< rad file="snippets/app.bicep" embed=true >}} + +Note that no Recipe name is specified within 'db', so it will be using the default Recipe for Redis in your environment. + +## Step 3: Deploy your application + +1. Run [`rad run`]({{< ref rad_run >}}) to deploy your application: + + ```bash + rad run ./app.bicep -a local-dev-app + ``` + + You should see the following output: + ``` + Building app.bicep... + Deploying template './app.bicep' for application 'local-dev-app' and environment 'default' from workspace 'default'... + + Deployment In Progress... + + Completed db Applications.Datastores/redisCaches + Completed frontend Applications.Core/containers + + Deployment Complete + + Resources: + frontend Applications.Core/containers + db Applications.Datastores/redisCaches + + Starting log stream... + ``` + + Your application is now deployed and running in your Kubernetes cluster. + +## Step 4: Verify Redis containers are deployed + +1. Visit [`http://localhost:3000`](http://localhost:3000) in your browser. + + You can now see both the environment variables of your container under Radius Connections as well as interact with the `Todo App` and add/remove items in it as wanted: + +1. List your Kubernetes Pods to see the infrastructure containers deployed by the Recipe: + + ```bash + kubectl get pods -n default-recipes + ``` + + You will see your 'frontend' container, along with the Redis cache that was automatically created by the default local-dev Recipe: + + ``` + NAME READY STATUS RESTARTS AGE + frontend-6d447f5994-pnmzv 1/1 Running 0 13m + redis-ymbjcqyjzwkpg-66fdbf8bb6-brb6q 2/2 Running 0 13m + ``` diff --git a/docs/content/guides/recipes/howto-dev-recipes/snippets/app.bicep b/docs/content/guides/recipes/howto-dev-recipes/snippets/app.bicep new file mode 100644 index 000000000..63ec11ae3 --- /dev/null +++ b/docs/content/guides/recipes/howto-dev-recipes/snippets/app.bicep @@ -0,0 +1,33 @@ +import radius as radius + +@description('The ID of your Radius environment. Automatically injected by the rad CLI.') +param environment string + +@description('The ID of your Radius application. Automatically injected by the rad CLI.') +param application string + +resource frontend 'Applications.Core/containers@2023-10-01-preview' = { + name: 'frontend' + properties: { + application: application + container: { + image: 'radius.azurecr.io/tutorial/webapp:edge' + } + connections: { + // Define a connection to the redis container + // Automatically injects conneciton information into the container + redis: { + source: db.id + } + } + } +} + +resource db 'Applications.Datastores/redisCaches@2023-10-01-preview' = { + name: 'db' + properties: { + environment: environment + application: application + // recipe is not specified, so it uses 'default' if present + } +} diff --git a/docs/content/guides/recipes/overview/index.md b/docs/content/guides/recipes/overview/index.md index 9b9d3837e..b6928ae51 100644 --- a/docs/content/guides/recipes/overview/index.md +++ b/docs/content/guides/recipes/overview/index.md @@ -57,7 +57,7 @@ Recipes currently support the following resources. Support for additional resour |---------------------| | [`Applications.Datastores/redisCaches`]({{< ref redis >}}) | | [`Applications.Datastores/mongoDatabases`]({{< ref mongodb >}}) | -| [`Applications.Datastores/sqlDatabases]({{< ref microsoft-sql >}}) | +| [`Applications.Datastores/sqlDatabases`]({{< ref microsoft-sql >}}) | | [`Applications.Messaging/rabbitmqQueues`]({{< ref rabbitmq >}}) | | [`Applications.Dapr/stateStores`]({{< ref dapr-statestore >}}) | | [`Applications.Dapr/pubSubBrokers`]({{< ref dapr-pubsub >}}) | diff --git a/docs/content/tutorials/tutorial-dapr/index.md b/docs/content/tutorials/tutorial-dapr/index.md index f6746aa1f..70b23e8be 100644 --- a/docs/content/tutorials/tutorial-dapr/index.md +++ b/docs/content/tutorials/tutorial-dapr/index.md @@ -18,13 +18,10 @@ For more details on the app and access to the source code, visit the `tutorials/ ## Prerequisites -- [Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) -- [Radius CLI]({{< ref "getting-started" >}}) -- [Radius Environment]({{< ref "/guides/deploy-apps/environments/overview" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) - [Dapr installed on your Kubernetes cluster](https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-deploy/) -- [Visual Studio Code](https://code.visualstudio.com/) (recommended) - - The [Radius VSCode extension]({{< ref "getting-started" >}}) is highly recommended to provide syntax highlighting, completion, and linting - - Although not recommended, you can also complete This how-to guide with any basic text editor ## Step 1: Define the application, `backend` container, and Dapr state store diff --git a/docs/content/tutorials/tutorial-recipe/index.md b/docs/content/tutorials/tutorial-recipe/index.md index 7169da5b1..819a017b0 100644 --- a/docs/content/tutorials/tutorial-recipe/index.md +++ b/docs/content/tutorials/tutorial-recipe/index.md @@ -32,8 +32,9 @@ Developers don't need to specify what cloud resources they're using in their app ## Prerequisites -- Install the [rad CLI]({{< ref getting-started >}}) -- Setup a supported [Kubernetes cluster]({{< ref "guides/operations/kubernetes" >}}) +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) ## Step 1: Initialize a Radius Environment diff --git a/docs/shared-content/installation/install-radius/initialize-radius.md b/docs/shared-content/installation/install-radius/initialize-radius.md index 76fe415be..ec477bc51 100644 --- a/docs/shared-content/installation/install-radius/initialize-radius.md +++ b/docs/shared-content/installation/install-radius/initialize-radius.md @@ -1,5 +1,16 @@ The Radius control-plane is a set of services that provide the core functionality of Radius. It is deployed as a set of containers in a Kubernetes cluster. +1. Create a Kubernetes cluster + + Radius runs inside [Kubernetes]({{< ref "guides/operations/kubernetes" >}}). Create one from the [supported k8s clusters]({{< ref "/guides/operations/kubernetes/overview#supported-kubernetes-clusters" >}}) + > *If you don't have a preferred way to create Kubernetes clusters, you could try using [k3d](https://k3d.io/), which runs a minimal Kubernetes distribution in Docker.* + + Ensure your cluster is set as your current context: + + ```bash + kubectl config current-context + ``` + 1. Initialize a new [Radius Environment]({{< ref "/guides/deploy-apps/environments/overview">}}) with [`rad init`]({{< ref rad_init >}}): ```bash rad init From c6ba8a9347cf43b1b2a6ac673596eba396d7669c Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:46:21 -0400 Subject: [PATCH 02/52] Sanitize docs for release references (#837) * Add how-to guide on local dev recipes (#822) * Add supported resource types * Add how-to guideto use local dev recipes * Apply suggestions from code review Co-authored-by: Jonathan Smith * Update docs/content/guides/recipes/howto-dev-recipes/index.md * Adddress feedback * Address feedback * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Minor tweaks * minor tweaks --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis * Sanitize docs for release references * Revert spelling fix * Apply suggestions from code review Co-authored-by: Aaron Crawfis --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis --- .../content/community/contributing/contributing-docs/index.md | 4 +++- .../guides/operations/control-plane/howto-postman/index.md | 2 +- docs/content/guides/operations/versioning.md | 2 +- docs/content/tutorials/eshop/_index.md | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/content/community/contributing/contributing-docs/index.md b/docs/content/community/contributing/contributing-docs/index.md index 1e1df92dc..9dbb7db91 100644 --- a/docs/content/community/contributing/contributing-docs/index.md +++ b/docs/content/community/contributing/contributing-docs/index.md @@ -204,8 +204,10 @@ Front-matter should be completed with all fields including type, title, linkTitl - `categories` should be one of the following: - Concept - Overview - - Reference application + - Tutorial - How-To + - Reference + - Schema - `tags` should be a comma-separated list of metadata tags. As per the [styling conventions](#styling-conventions), titles should only capitalize the first word and proper nouns, with the exception of "How-To:" diff --git a/docs/content/guides/operations/control-plane/howto-postman/index.md b/docs/content/guides/operations/control-plane/howto-postman/index.md index 96aafa88c..ee0d68613 100644 --- a/docs/content/guides/operations/control-plane/howto-postman/index.md +++ b/docs/content/guides/operations/control-plane/howto-postman/index.md @@ -100,7 +100,7 @@ Next, you'll need to get the control plane API endpoint and use Postman to inter 1. Set the URL to the following, which will [retrieve all your resource groups]({{< ref api-ucp >}}): ``` - /apis/api.ucp.dev/v1alpha3/planes/radius/local/resourcegroups?api-version=2022-09-01-privatepreview + /apis/api.ucp.dev/v1alpha3/planes/radius/local/resourcegroups?api-version=2023-10-01-preview ``` Screenshot of Postman with filled out URL diff --git a/docs/content/guides/operations/versioning.md b/docs/content/guides/operations/versioning.md index c0e360fe5..32f6255b4 100644 --- a/docs/content/guides/operations/versioning.md +++ b/docs/content/guides/operations/versioning.md @@ -9,6 +9,6 @@ category: "Overview" ## Overview -Radius is currently in an early alpha preview and does not offer backward compatibility with previous releases. Breaking changes may happen between releases and we recommend doing a fresh installation of the latest version of Radius after every release. +Radius does not currently offer backward compatibility with previous releases. Breaking changes may happen between releases and we recommend doing a fresh installation of the latest version of Radius after every release. We are working on the versioning strategy and will be introducing a versioning policy in the future. diff --git a/docs/content/tutorials/eshop/_index.md b/docs/content/tutorials/eshop/_index.md index 59c8a382a..a6c3073d0 100644 --- a/docs/content/tutorials/eshop/_index.md +++ b/docs/content/tutorials/eshop/_index.md @@ -38,6 +38,6 @@ Adding Radius to the eShop on containers application allows teams to: - Easily manage configuration and credentials between infrastructure and services, all within the app model - Simplify deployment with Bicep and Azure Resource Manager (ARM) -{{< button text="View eShop reference app in samples" githubRepo="samples" githubPath="samples/eshop" color="success" size="btn-lg" >}} +{{< button text="View eShop sample" githubRepo="samples" githubPath="samples/eshop" color="success" size="btn-lg" >}} *Visit the [GitHub docs]({{< ref github >}}) if you need access to the organization* \ No newline at end of file From b21230730fd74a9fb0a093719c2fac3ac717439b Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Fri, 13 Oct 2023 14:22:34 -0700 Subject: [PATCH 03/52] Add Codespace docs Signed-off-by: Aaron Crawfis --- docs/content/getting-started/index.md | 6 ++++++ docs/content/installation/index.md | 4 ++-- .../install-radius/initialize-radius.md | 2 +- .../installation/rad-cli/install-rad-cli.md | 17 ++++++++++++----- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/docs/content/getting-started/index.md b/docs/content/getting-started/index.md index 614dca12a..49840116b 100644 --- a/docs/content/getting-started/index.md +++ b/docs/content/getting-started/index.md @@ -16,6 +16,12 @@ This guide will show you how to quickly get started with Radius. You'll walk thr Diagram of the application and its resources +{{< alert title="πŸš€ Run in a free GitHub Codespace" color="primary" >}} +The Radius getting-started guide can be [run **for free** in a GitHub Codespace](https://github.blog/changelog/2022-11-09-codespaces-for-free-and-pro-accounts/). Visit the following link to get started in seconds: + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/radius-project/samples) +{{< /alert >}} + ## 1. Have your Kubernetes cluster handy Radius runs inside [Kubernetes]({{< ref "guides/operations/kubernetes" >}}). However you run Kubernetes, get a cluster ready. diff --git a/docs/content/installation/index.md b/docs/content/installation/index.md index d73dc5cee..0b7caeac7 100644 --- a/docs/content/installation/index.md +++ b/docs/content/installation/index.md @@ -14,11 +14,11 @@ Radius consists of a set of tools and services that together form the Radius pla {{< read file= "/shared-content/installation/rad-cli/install-rad-cli.md" >}} -## Step 2: Install the Radius-Bicep VS Code extension +## Step 2: Install the VS Code extension {{< read file= "/shared-content/installation/vscode-bicep/install-vscode-bicep.md" >}} -## Step 3: Initialize the Radius control-plane and the Radius Environment +## Step 3: Initialize Radius {{< read file= "/shared-content/installation/install-radius/initialize-radius.md" >}} diff --git a/docs/shared-content/installation/install-radius/initialize-radius.md b/docs/shared-content/installation/install-radius/initialize-radius.md index ec477bc51..ab6ba4ca7 100644 --- a/docs/shared-content/installation/install-radius/initialize-radius.md +++ b/docs/shared-content/installation/install-radius/initialize-radius.md @@ -1,4 +1,4 @@ -The Radius control-plane is a set of services that provide the core functionality of Radius. It is deployed as a set of containers in a Kubernetes cluster. +Initializing Radius installs the Radius control-plane and creates a Radius Environment. The control-plane is a set of services that provide the core functionality of Radius, running in the `radius-system` namespace. 1. Create a Kubernetes cluster diff --git a/docs/shared-content/installation/rad-cli/install-rad-cli.md b/docs/shared-content/installation/rad-cli/install-rad-cli.md index 4fd7fdcee..1172eafc5 100644 --- a/docs/shared-content/installation/rad-cli/install-rad-cli.md +++ b/docs/shared-content/installation/rad-cli/install-rad-cli.md @@ -1,18 +1,18 @@ The `rad` CLI manages your applications, resources, and environments. You can install it on your local machine with the following installation scripts: -{{< tabs MacOS "Linux/WSL" "Windows PowerShell" "Cloud Shell" Binaries >}} +{{< tabs "Linux/WSL" MacOS "Windows PowerShell" "GitHub Codespace" "Azure Cloud Shell" Binaries >}} {{% codetab %}} {{< latest >}} ```bash -curl -fsSL "https://get.radapp.dev/tools/rad/install.sh" | /bin/bash +wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash ``` {{< /latest >}} {{< edge >}} To install the latest edge version: ```bash -curl -fsSL "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" | /bin/bash -s edge +wget -q "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" -O - | /bin/bash -s edge ``` {{< /edge >}} {{% /codetab %}} @@ -20,14 +20,14 @@ curl -fsSL "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" | / {{% codetab %}} {{< latest >}} ```bash -wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash +curl -fsSL "https://get.radapp.dev/tools/rad/install.sh" | /bin/bash ``` {{< /latest >}} {{< edge >}} To install the latest edge version: ```bash -wget -q "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" -O - | /bin/bash -s edge +curl -fsSL "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" | /bin/bash -s edge ``` {{< /edge >}} {{% /codetab %}} @@ -54,6 +54,13 @@ $script=iwr -useb https://radiuspublic.blob.core.windows.net/tools/rad/install. {{< /edge >}} {{% /codetab %}} +{{% codetab %}} +Radius offers a **free** Codespace option for getting up and running with a Radius environment in seconds: + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/radius-project/samples) + +{{% /codetab %}} + {{% codetab %}} [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) is an interactive, authenticated, browser-accessible shell for managing Azure resources. From f9183caa79ddf8d5348eaae30a739934ca593b5a Mon Sep 17 00:00:00 2001 From: Karishma Chawla Date: Fri, 13 Oct 2023 15:50:43 -0700 Subject: [PATCH 04/52] Update instructions for `How To Configure AWS Provider` (#839) --- .../operations/providers/howto-aws-provider/index.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/content/guides/operations/providers/howto-aws-provider/index.md b/docs/content/guides/operations/providers/howto-aws-provider/index.md index cc0b7846b..341138bc8 100644 --- a/docs/content/guides/operations/providers/howto-aws-provider/index.md +++ b/docs/content/guides/operations/providers/howto-aws-provider/index.md @@ -14,9 +14,7 @@ The AWS provider allows you to deploy and connect to AWS resources from a Radius ## Prerequisites -- [EKS cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - [AWS account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account) and an [IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html) -- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) ## Interactive configuration @@ -27,9 +25,9 @@ The AWS provider allows you to deploy and connect to AWS resources from a Radius ``` 1. Follow the prompts, specifying: - - **Namespace** - The Kubernetes namespace where your application containers and networking resources will be deployed (different than the Radius control-plane namespace, `radius-system`) - - **Add an AWS provider** - Enter your IAM credentials and pick a region to deploy your AWS resources to - - **Environment name** - The name of the environment to create + - **Namespace** - The Kubernetes namespace where your application containers and networking resources will be deployed (different than the Radius control-plane namespace, `radius-system`). + - **Add an AWS provider** - Enter your IAM access key and secret key and pick a region to deploy your AWS resources to. + - **Environment name** - The name of the environment to create. You should see the following output: @@ -61,4 +59,4 @@ The AWS provider allows you to deploy and connect to AWS resources from a Radius ```bash rad credential register aws --access-key-id myAccessKeyId --secret-access-key mySecretAccessKey ``` - For more information on the command arguments visit [`rad credential register aws`]({{< ref rad_credential_register_aws >}}) \ No newline at end of file + For more information on the command arguments visit [`rad credential register aws`]({{< ref rad_credential_register_aws >}}) From 3d3b66d48fd6aeb2f23a5e93d2b8b26224fd8de0 Mon Sep 17 00:00:00 2001 From: Vishwanath Hiremath <100623239+vishwahiremat@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:24:51 -0700 Subject: [PATCH 05/52] Fixing a typo from the rad install kubernetes command (#846) --- .../guides/operations/kubernetes/kubernetes-install/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guides/operations/kubernetes/kubernetes-install/index.md b/docs/content/guides/operations/kubernetes/kubernetes-install/index.md index 3306323ba..11b857474 100644 --- a/docs/content/guides/operations/kubernetes/kubernetes-install/index.md +++ b/docs/content/guides/operations/kubernetes/kubernetes-install/index.md @@ -20,7 +20,7 @@ Use the [`rad install kubernetes` command]({{< ref rad_install_kubernetes >}}) t rad install kubernetes # Install Radius with tracing and public endpoint override -rad install kubernetes --set global.zipkin.url=http://jaeger-collector.radius-monitoring.svc.cluster.local:9411/api/v2/spans,rp.publicEndpointOverride=localhost:8081` +rad install kubernetes --set global.zipkin.url=http://jaeger-collector.radius-monitoring.svc.cluster.local:9411/api/v2/spans,rp.publicEndpointOverride=localhost:8081 ``` ## Install with Helm From 22ffcd20e994984af442f912ff06254d324ef12c Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 16 Oct 2023 11:29:57 -0700 Subject: [PATCH 06/52] Update pull_request_template.md (#844) --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 33db12592..3d2a5b928 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,7 +2,7 @@ Thank you for helping make the Radius documentation better! **Please follow this checklist before submitting:** -- [ ] [Read the contribution guide](https://docs.radapp.dev/contributing/docs/) +- [ ] [Read the contribution guide](https://docs.radapp.dev/community/contributing/docs/) - [ ] Commands include options for Linux, MacOS, and Windows within codetabs - [ ] New file and folder names are globally unique - [ ] Page references use shortcodes instead of markdown or URL links From b54e57ad2c6de069078d08be4c982e161b5b44ba Mon Sep 17 00:00:00 2001 From: Shalabh Mohan Shrivastava Date: Mon, 16 Oct 2023 11:37:13 -0700 Subject: [PATCH 07/52] Update steps after port forward to view the contents of /tmpdir (#847) Update steps after port forward to view the contents of /tmpdir Co-authored-by: Aaron Crawfis --- .../guides/author-apps/containers/howto-volumes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guides/author-apps/containers/howto-volumes/index.md b/docs/content/guides/author-apps/containers/howto-volumes/index.md index c2bb14853..ede1a1f23 100644 --- a/docs/content/guides/author-apps/containers/howto-volumes/index.md +++ b/docs/content/guides/author-apps/containers/howto-volumes/index.md @@ -39,7 +39,7 @@ The `samples/volumes` container will display the status and contents of the `/tm ```bash rad resource expose containers mycontainer -a myapp --port 5000 ``` -1. You should see a message warning that the directory `/tmpdir` does not exist: +1. Visit [localhost:5000](http://localhost:5000) in your browser. You should see a message warning that the directory `/tmpdir` does not exist: Screeshot of container showing that the tmp directory does not exist From 9c7a139b35d7bb4b6bc0ee45c4e5747e129db5af Mon Sep 17 00:00:00 2001 From: Shalabh Mohan Shrivastava Date: Mon, 16 Oct 2023 11:53:27 -0700 Subject: [PATCH 08/52] Updating the initialization verification doc (#843) Co-authored-by: Aaron Crawfis --- .../install-radius/initialize-radius.md | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/docs/shared-content/installation/install-radius/initialize-radius.md b/docs/shared-content/installation/install-radius/initialize-radius.md index ab6ba4ca7..2b871dfc1 100644 --- a/docs/shared-content/installation/install-radius/initialize-radius.md +++ b/docs/shared-content/installation/install-radius/initialize-radius.md @@ -2,8 +2,9 @@ Initializing Radius installs the Radius control-plane and creates a Radius Envir 1. Create a Kubernetes cluster - Radius runs inside [Kubernetes]({{< ref "guides/operations/kubernetes" >}}). Create one from the [supported k8s clusters]({{< ref "/guides/operations/kubernetes/overview#supported-kubernetes-clusters" >}}) - > *If you don't have a preferred way to create Kubernetes clusters, you could try using [k3d](https://k3d.io/), which runs a minimal Kubernetes distribution in Docker.* + Radius runs inside [Kubernetes]({{< ref "guides/operations/kubernetes" >}}). Create one from the [supported k8s clusters]({{< ref "/guides/operations/kubernetes/overview#supported-kubernetes-clusters" >}}) + + > _If you don't have a preferred way to create Kubernetes clusters, you could try using [k3d](https://k3d.io/), which runs a minimal Kubernetes distribution in Docker._ Ensure your cluster is set as your current context: @@ -12,26 +13,28 @@ Initializing Radius installs the Radius control-plane and creates a Radius Envir ``` 1. Initialize a new [Radius Environment]({{< ref "/guides/deploy-apps/environments/overview">}}) with [`rad init`]({{< ref rad_init >}}): + ```bash rad init ``` - + Select `Yes` to setup the app.bicep in the current directory ``` - Initializing Radius... - - πŸ•” Install Radius {{< param version >}} + Initializing Radius... + + πŸ•” Install Radius {{< param version >}} - Kubernetes cluster: kind - - Kubernetes namespace: radius-system - ⏳ Create new environment default - - Kubernetes namespace: default - - Recipe pack: local-dev - ⏳ Scaffold application - ⏳ Update local configuration - ``` - -2. Verify the initialization by running: + - Kubernetes namespace: radius-system + ⏳ Create new environment default + - Kubernetes namespace: default + - Recipe pack: local-dev + ⏳ Scaffold application + ⏳ Update local configuration + ``` + +1. Verify the initialization by running: + ```bash kubectl get deployments -n radius-system ``` @@ -40,14 +43,15 @@ Initializing Radius installs the Radius control-plane and creates a Radius Envir ``` NAME READY UP-TO-DATE AVAILABLE AGE - ucp 1/1 1 1 53s - appcore-rp 1/1 1 1 53s + applications-rp 1/1 1 1 53s bicep-de 1/1 1 1 53s + controller 1/1 1 1 53s + ucp 1/1 1 1 53s contour-contour 1/1 1 1 46s ``` You can also use [`rad env list`]({{< ref rad_env_list.md >}}) to view your environment: - + ```bash rad env list - ``` \ No newline at end of file + ``` From e4236a695a4b2db773be2da864788ba55aabe381 Mon Sep 17 00:00:00 2001 From: Lakshmi Javadekar <103459615+lakshmimsft@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:14:25 -0700 Subject: [PATCH 09/52] Update index.md with '' instead of 'frontend' (#848) In commend to 'inspect container logs' update current value 'frontend' with a more generic '' similar to other commands in the document --- docs/content/guides/deploy-apps/howto-troubleshootapps/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guides/deploy-apps/howto-troubleshootapps/index.md b/docs/content/guides/deploy-apps/howto-troubleshootapps/index.md index a950b76ed..f22ef1fb4 100644 --- a/docs/content/guides/deploy-apps/howto-troubleshootapps/index.md +++ b/docs/content/guides/deploy-apps/howto-troubleshootapps/index.md @@ -26,7 +26,7 @@ Refer to [`rad resource expose`]({{< ref rad_resource_expose >}}) for more detai If your Radius Application is unresponsive or does not connect to its dependencies, Use the below command to inspect logs from container: ```bash -rad resource logs containers frontend -a +rad resource logs containers -a ``` > Also refer to the [connections section]({{< ref "guides/author-apps/containers/overview#connections" >}}) to know about the naming convention of the environment variables and inspect if your application uses the right variables. From ccddcd64377b06f4e88ba7609e389a3a1171e721 Mon Sep 17 00:00:00 2001 From: Yetkin Timocin Date: Mon, 16 Oct 2023 12:58:19 -0700 Subject: [PATCH 10/52] Updating How To Connect Dependencies doc (#850) --- .../containers/howto-connect-dependencies/index.md | 2 +- .../howto-connect-dependencies/snippets/app.bicep | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md b/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md index 8837a3d28..d6957be2b 100644 --- a/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md +++ b/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md @@ -50,7 +50,7 @@ Connections from a container to a resource result in environment variables for c Radius Connections are more than just environment variables and configuration. You can also access the "application graph" and understand the connections within your application with the following command: ```bash -rad app connections +rad app connections -a demo ``` You should see the following output, detailing the connections between the `demo` container and the `db` Redis cache, along with information about the underlying Kubernetes resources running the app: diff --git a/docs/content/guides/author-apps/containers/howto-connect-dependencies/snippets/app.bicep b/docs/content/guides/author-apps/containers/howto-connect-dependencies/snippets/app.bicep index eaae366b4..a6e21b966 100644 --- a/docs/content/guides/author-apps/containers/howto-connect-dependencies/snippets/app.bicep +++ b/docs/content/guides/author-apps/containers/howto-connect-dependencies/snippets/app.bicep @@ -3,12 +3,17 @@ import radius as rad @description('The app ID of your Radius application. Set automatically by the rad CLI.') param application string -resource container 'Applications.Core/containers@2023-10-01-preview' = { +resource demo 'Applications.Core/containers@2023-10-01-preview' = { name: 'demo' properties: { application: application container: { image: 'radius.azurecr.io/samples/demo:latest' + ports: { + web: { + containerPort: 3000 + } + } } } } From 85b3f756151ce8ee2666cea7bf9f21bbb9b62b76 Mon Sep 17 00:00:00 2001 From: Ryan Waite Date: Mon, 16 Oct 2023 14:18:20 -0700 Subject: [PATCH 11/52] Multi-cloud and OSS concept doc (#821) * 1st draft of multi-cloud and OSS concept doc * Fixing spelling errors * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Update to correct open-source spelling Co-authored-by: Aaron Crawfis * Changing doc weight to 100 per Aaron. Co-authored-by: Aaron Crawfis * Apply break after header Co-authored-by: Aaron Crawfis * Correct spelling error for "application" Co-authored-by: Ryan Nowak * Add blank line after heading Co-authored-by: Aaron Crawfis * Add blank line after heading Co-authored-by: Aaron Crawfis * Include Helm charts in description of deployment assets Co-authored-by: Ryan Nowak * Amazon S3 is not valid Dapr state store, so use DynamoDB instead Co-authored-by: Ryan Nowak * More substantial changes based on Nowak's feedback * Updating en-custom.txt spelling * Put the "Concept:" in quotes to prevent build errors Co-authored-by: Ryan Nowak * Get more specific about publicly available Co-authored-by: Ryan Nowak * Update docs/content/concepts/multi-cloud-concept/index.md Co-authored-by: Aaron Crawfis * Spellcheck --------- Co-authored-by: Aaron Crawfis Co-authored-by: Ryan Nowak --- .github/config/en-custom.txt | 6 ++- .../concepts/multi-cloud-concept/index.md | 51 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 docs/content/concepts/multi-cloud-concept/index.md diff --git a/.github/config/en-custom.txt b/.github/config/en-custom.txt index 927164885..1de903f5d 100644 --- a/.github/config/en-custom.txt +++ b/.github/config/en-custom.txt @@ -18,6 +18,7 @@ ClusterIssuer CLI CLIs CMD +CNCF CQRS CRDs CRUDL @@ -39,6 +40,7 @@ Docsy DocumentDB EKS eksClusterName +ElastiCache entrypoint EOF Extensibility @@ -88,6 +90,7 @@ PowerShell Pre PubSub ProjectRadius +radify RBAC RabbitMQ ResourceDeploymentClient @@ -475,4 +478,5 @@ ConfigMap PodSpec composable CRD -nd \ No newline at end of file +nd +OSI diff --git a/docs/content/concepts/multi-cloud-concept/index.md b/docs/content/concepts/multi-cloud-concept/index.md new file mode 100644 index 000000000..038d3a5af --- /dev/null +++ b/docs/content/concepts/multi-cloud-concept/index.md @@ -0,0 +1,51 @@ +--- +type: docs +title: "Concept: Open-source and multi-cloud" +linkTitle: Open-source and multi-cloud +description: For many enterprises, their cloud native computing strategy involves using multiple cloud providers. Open source projects, like Kubernetes, help ensure these enterprises achieve their strategy. As a result, Radius was designed to be open-source and multi-cloud from the start. +weight: 100 +categories: "Concept" +--- + +## Organizations are increasingly multi-cloud + +Radius is designed to meet developers, and the platform engineers that support them, where they are, integrating with existing best practices while providing new benefits through features like the Radius Application Graph and Radius Environments and Recipes. We talked to a lot of organizations about their cloud usage, and learned that they were either using multiple cloud providers or were going to use multiple cloud providers. In short, multi-cloud is a trend that is accelerating in popularity. + +What does multi-cloud really mean? Throughout the design phase of Radius, we've have many conversations with large enterprises about their usage of the cloud, and in particular about their usage of multiple clouds. We were curious about why enterprises use multiple clouds and what problems they need help solving. In talking with these enterprises and with cloud native software vendors we found three types of multi-cloud use: + +1. Multi-cloud enterprise: these enterprises deployed some applications to one cloud provider and other applications to another cloud provider. +1. Cloud-agnostic applications: these enterprises deploy the same application to different cloud providers. +1. Multi-cloud application: these enterprises have a single application that is distributed across multiple clouds. + +The third case, a single application that is running across multiple clouds, was incredibly rare. Enterprises that had experimented with multi-cloud applications cited almost insurmountable challenges with operations, security, and performance management. While Radius can help with these kinds of applications, supporting these kinds of applications was not a design goal for Radius. + +Radius is designed to meet the first two types of multi-cloud use. + +### Multi-cloud enterprise + +The multi-cloud enterprise case was the most common case we encountered. Some enterprises explained that they were multi-cloud due to decentralized decision making, acquisitions, or inertia. For example, some enterprises let individual engineering teams decide which cloud worked best for the type of application they were building. These teams would select a cloud provider for a variety of reasons, such as prior experience with a cloud provider, unique cloud provider features, or the way a particular cloud provider integrated with other tools or practices used by the team. + +Some enterprises explained that they were multi-cloud through acquisitions. Their new parent company might have selected a particular cloud provider that is different than their choice. For many customers we spoke with there was little to no requirement to migrate their existing applications from one cloud provider to another cloud provider. + +Finally, some enterprises explained that they were multi-cloud due to inertia. They had started with one cloud provider, but later, switched to using a different provider as their primary choice for new applications. Like the acquisition case above, there was no requirement to move existing applications to the new cloud provider. + +Radius was designed with these enterprises in mind. Enterprises can "radify" their applications regardless of cloud provider, enabling these enterprises to use Radius regardless of whether or not the application is using a particular public cloud provider or a private cloud operated by the enterprise itself. Radius applications can use cloud vendor specific technologies, like Amazon's DynamoDB or Azure's Cosmos DB, or they can use open source technologies like Redis. + +### Cloud-agnostic applications + +There were some enterprises that ran the same application in multiple clouds. Often these enterprises had business requirements that required them to use multiple cloud providers. For example, some financial services enterprises had to host their application and any data associated with the application in a particular country or geographic region. The enterprise would need their application to be deployable to whichever cloud provider was available in a specific country or region. + +Radius was designed to support this specific use case from the start. We wanted to make it possible for IT teams, platform engineering teams, or cloud center of excellence teams to make decisions about which cloud provider an application would use. We wanted them to be able to make that decision without having an impact on their developers and the application logic those developers were writing. + +Radius supports cloud-agnostic applications in two ways. First, enterprises can use open source technologies in their applications. For example, developers that need a cache might use a Redis cache in their application. The platform engineering team would build Radius Recipes that, depending on the cloud provider, would use a different underlying Redis compatible service. This might mean using Azure Cache for Redis when deploying to Azure or Amazon ElastiCache for Redis on AWS. The developer's application logic and deployment assets like Helm charts should be the same, regardless of which cloud they're using. + +The second way Radius supports cloud-agnostic applications is with [Dapr, the Distributed Application Runtime](https://dapr.io). Dapr provides developers with APIs that abstract away the complexity of common challenges developers encounter regularly when building cloud native applications. These API building blocks abstract away services that provide state management, secrets management, or publish and subscribe systems. Developers can write to Dapr and platform engineering teams can use Radius to provide the underlying infrastructure for these Dapr based applications. For example, a Dapr application that's persisting state could use Azure Blob Storage or Amazon DynamoDB as the underlying state store depending on which cloud provider was used to host the application. + +Radius was designed from the start to support enterprises in implementing their multi-cloud strategy. Enterprises can use cloud vendor technologies, like DynamoDB, or they can build on open source technologies like Redis and Dapr. + +## Open-source +Many enterprises use open-source technologies as a way of *achieving* their multi-cloud strategy. Kubernetes adoption is a great example of this trend. Customers building on Kubernetes can leverage their Kubernetes experience, tools, and practices with any cloud provider and they're confident Kubernetes, with it's broad community, will continue to be a multi-cloud technology. + +Radius was designed to be an open-source project from the start as part of the way Radius would support enterprise multi-cloud strategies. Open-source can mean different things to different people. For Radius, open-source means that our source code is publicly available under an OSI-approved permissive license. It also means that the Radius project uses an neutral and open governance model to continue the evolution of Radius as a multi-cloud technology going forward. Anyone should be able to contribute to Radius, extend the platform, self-host Radius for internal use, or use it to build a business hosting other people's applications. + +The Radius team has worked with the Cloud Native Computing Foundation (CNCF) to bring Radius into the CNCF as a new CNCF project. The Radius team is optimistic that Radius will be a success, both in helping enterprises achieve their multi-cloud strategies as well as in bringing powerful concepts, like Environments, Recipes, and the Application Graph, to the broader cloud native community. From 70117ae26c4d3d996532803603c2eb405b453329 Mon Sep 17 00:00:00 2001 From: Shruthi Kumar Date: Mon, 16 Oct 2023 14:29:43 -0700 Subject: [PATCH 12/52] Update index.md (#854) Updating local dev recipes docs to use correct pod name --- docs/content/guides/recipes/howto-dev-recipes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guides/recipes/howto-dev-recipes/index.md b/docs/content/guides/recipes/howto-dev-recipes/index.md index a8fdf74d4..6d89fdfa0 100644 --- a/docs/content/guides/recipes/howto-dev-recipes/index.md +++ b/docs/content/guides/recipes/howto-dev-recipes/index.md @@ -100,7 +100,7 @@ Note that no Recipe name is specified within 'db', so it will be using the defau 1. List your Kubernetes Pods to see the infrastructure containers deployed by the Recipe: ```bash - kubectl get pods -n default-recipes + kubectl get pods -n default-local-dev-app ``` You will see your 'frontend' container, along with the Redis cache that was automatically created by the default local-dev Recipe: From 38dd7f343c27cbf9a27b9c0de82e1d504d9a708d Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 16 Oct 2023 14:32:12 -0700 Subject: [PATCH 13/52] Update link to initialize page (#853) * Update link Signed-off-by: Aaron Crawfis * Update vscode link Signed-off-by: Aaron Crawfis --------- Signed-off-by: Aaron Crawfis --- .../guides/author-apps/azure/howto-azure-resources/index.md | 2 +- .../containers/howto-connect-dependencies/index.md | 4 ++-- .../author-apps/containers/howto-keyvault-volume/index.md | 2 +- .../guides/author-apps/containers/howto-volumes/index.md | 4 ++-- .../guides/author-apps/networking/howto-gateways/index.md | 4 ++-- .../author-apps/networking/howto-service-networking/index.md | 4 ++-- docs/content/guides/author-apps/networking/howto-tls/index.md | 4 ++-- .../deploy-apps/environments/howto-environment/index.md | 2 +- .../guides/operations/control-plane/howto-postman/index.md | 2 +- docs/content/guides/recipes/howto-author-recipes/index.md | 4 ++-- docs/content/guides/recipes/howto-dev-recipes/index.md | 2 +- docs/content/tutorials/tutorial-dapr/index.md | 4 ++-- docs/content/tutorials/tutorial-recipe/index.md | 2 +- 13 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/content/guides/author-apps/azure/howto-azure-resources/index.md b/docs/content/guides/author-apps/azure/howto-azure-resources/index.md index 24394af4a..40bad9560 100644 --- a/docs/content/guides/author-apps/azure/howto-azure-resources/index.md +++ b/docs/content/guides/author-apps/azure/howto-azure-resources/index.md @@ -20,7 +20,7 @@ The steps below will showcase a "rad-ified" version of the existing [Azure AD wo ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) - [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/installation.html) installed in your cluster diff --git a/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md b/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md index d6957be2b..50346fce5 100644 --- a/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md +++ b/docs/content/guides/author-apps/containers/howto-connect-dependencies/index.md @@ -13,8 +13,8 @@ This how-to guide will teach how to connect to your dependencies via [connection ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) ## Step 1: View the container definition diff --git a/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md b/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md index d5d1d4e5a..97b054876 100644 --- a/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md +++ b/docs/content/guides/author-apps/containers/howto-keyvault-volume/index.md @@ -19,7 +19,7 @@ This how-to guide will provide an overview of how to: ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) - [Supported Kubernetes cluster]({{< ref "guides/operations/kubernetes" >}}) - [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/installation.html) installed on your cluster - [Azure Keyvault Provider](https://azure.github.io/secrets-store-csi-driver-provider-azure/docs/getting-started/installation/) diff --git a/docs/content/guides/author-apps/containers/howto-volumes/index.md b/docs/content/guides/author-apps/containers/howto-volumes/index.md index ede1a1f23..530c325b7 100644 --- a/docs/content/guides/author-apps/containers/howto-volumes/index.md +++ b/docs/content/guides/author-apps/containers/howto-volumes/index.md @@ -16,8 +16,8 @@ This how-to guide will provide an overview of how to: ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) ## Step 1: Define an app and a container diff --git a/docs/content/guides/author-apps/networking/howto-gateways/index.md b/docs/content/guides/author-apps/networking/howto-gateways/index.md index f6165b4b8..db73e9700 100644 --- a/docs/content/guides/author-apps/networking/howto-gateways/index.md +++ b/docs/content/guides/author-apps/networking/howto-gateways/index.md @@ -13,8 +13,8 @@ This guide will walk you through how to setup a gateway for routing internet tra ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) ## Step 1: Define a container diff --git a/docs/content/guides/author-apps/networking/howto-service-networking/index.md b/docs/content/guides/author-apps/networking/howto-service-networking/index.md index ba0cb8ab4..40cd4d766 100644 --- a/docs/content/guides/author-apps/networking/howto-service-networking/index.md +++ b/docs/content/guides/author-apps/networking/howto-service-networking/index.md @@ -15,8 +15,8 @@ This guide will show you how two services can communicate with each other. In th ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) ## Step 1: Define the services diff --git a/docs/content/guides/author-apps/networking/howto-tls/index.md b/docs/content/guides/author-apps/networking/howto-tls/index.md index de03cbf68..fa3aefc87 100644 --- a/docs/content/guides/author-apps/networking/howto-tls/index.md +++ b/docs/content/guides/author-apps/networking/howto-tls/index.md @@ -13,8 +13,8 @@ This guide will show you how to add TLS and HTTPS to an application with a gatew ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) - Domain name + DNS A-record pointing to your Kubernetes cluster - If running Radius on an Azure Kubernetes Service (AKS) cluster you can optionally use a [DNS label](https://learn.microsoft.com/azure/virtual-network/ip-services/public-ip-addresses#dns-name-label) to create a DNS A-record pointing to your cluster. - If running Radius on an Elastic Kubernetes Service (EKS) cluster you can optionally leverage an [Application Load Balancer](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) for a hosted DNS name and record. diff --git a/docs/content/guides/deploy-apps/environments/howto-environment/index.md b/docs/content/guides/deploy-apps/environments/howto-environment/index.md index c8189364a..d247a1173 100644 --- a/docs/content/guides/deploy-apps/environments/howto-environment/index.md +++ b/docs/content/guides/deploy-apps/environments/howto-environment/index.md @@ -16,7 +16,7 @@ Radius Environments can be setup with the rad CLI via two paths: interactive or - [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) ## Create a development environment diff --git a/docs/content/guides/operations/control-plane/howto-postman/index.md b/docs/content/guides/operations/control-plane/howto-postman/index.md index ee0d68613..aced3f377 100644 --- a/docs/content/guides/operations/control-plane/howto-postman/index.md +++ b/docs/content/guides/operations/control-plane/howto-postman/index.md @@ -16,7 +16,7 @@ Before you get started, you'll need to make sure you have the following tools an - [Postman](https://www.postman.com/) - [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) ### Step 1: Create Kubernetes objects diff --git a/docs/content/guides/recipes/howto-author-recipes/index.md b/docs/content/guides/recipes/howto-author-recipes/index.md index d09e58168..520cd5763 100644 --- a/docs/content/guides/recipes/howto-author-recipes/index.md +++ b/docs/content/guides/recipes/howto-author-recipes/index.md @@ -13,8 +13,8 @@ tags: ["recipes"] Before you get started, you'll need to make sure you have the following tools and resources: - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) - [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) ### Step 1: Author a Recipe template diff --git a/docs/content/guides/recipes/howto-dev-recipes/index.md b/docs/content/guides/recipes/howto-dev-recipes/index.md index 6d89fdfa0..be10b1949 100644 --- a/docs/content/guides/recipes/howto-dev-recipes/index.md +++ b/docs/content/guides/recipes/howto-dev-recipes/index.md @@ -13,7 +13,7 @@ Local development environments created by the rad init command include a set of ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) - [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) ## Step 1: Initialize a Radius environment diff --git a/docs/content/tutorials/tutorial-dapr/index.md b/docs/content/tutorials/tutorial-dapr/index.md index 70b23e8be..75c7222c5 100644 --- a/docs/content/tutorials/tutorial-dapr/index.md +++ b/docs/content/tutorials/tutorial-dapr/index.md @@ -19,8 +19,8 @@ For more details on the app and access to the source code, visit the `tutorials/ ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) -- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-radius" >}}) - [Dapr installed on your Kubernetes cluster](https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-deploy/) ## Step 1: Define the application, `backend` container, and Dapr state store diff --git a/docs/content/tutorials/tutorial-recipe/index.md b/docs/content/tutorials/tutorial-recipe/index.md index 819a017b0..24104927a 100644 --- a/docs/content/tutorials/tutorial-recipe/index.md +++ b/docs/content/tutorials/tutorial-recipe/index.md @@ -33,7 +33,7 @@ Developers don't need to specify what cloud resources they're using in their app ## Prerequisites - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) -- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) - [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) ## Step 1: Initialize a Radius Environment From 280bad69d48f1b04f89ef44924bd368a7eb9c2b5 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 16 Oct 2023 14:57:43 -0700 Subject: [PATCH 14/52] Update copy logic (#855) Signed-off-by: Aaron Crawfis --- docs/static/js/copy-code-button.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/static/js/copy-code-button.js b/docs/static/js/copy-code-button.js index ca5d0e26e..eb42c3d80 100644 --- a/docs/static/js/copy-code-button.js +++ b/docs/static/js/copy-code-button.js @@ -19,12 +19,15 @@ highlightClass.forEach(element => { copyIcon.addEventListener('click', async () => { const selection = window.getSelection(); const range = document.createRange(); - range.selectNodeContents(element); + const codeElements = element.querySelectorAll('code'); + const codeElement = codeElements.length > 1 ? codeElements[1] : codeElements[0]; + range.selectNodeContents(codeElement); selection.removeAllRanges(); selection.addRange(range); + const text = selection.toString(); try { - await navigator.clipboard.writeText(selection.toString()); + await navigator.clipboard.writeText(text); console.log('Text copied to clipboard'); copyIcon.classList.replace('fa-copy', 'fa-check'); selection.removeAllRanges(); From f65da5e53f31ceb9219ce349fed01016205edef2 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 16 Oct 2023 15:28:14 -0700 Subject: [PATCH 15/52] Fix code formatting (#856) --- .../control-plane/logs/fluentd/index.md | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/docs/content/guides/operations/control-plane/logs/fluentd/index.md b/docs/content/guides/operations/control-plane/logs/fluentd/index.md index 0de7ea463..59c6e3e1d 100644 --- a/docs/content/guides/operations/control-plane/logs/fluentd/index.md +++ b/docs/content/guides/operations/control-plane/logs/fluentd/index.md @@ -52,7 +52,12 @@ tags: ["logs","observability"] 5. Ensure that Elastic Search and Kibana are running in your Kubernetes cluster ```bash - $ kubectl get pods -n radius-monitoring + kubectl get pods -n radius-monitoring + ``` + + You should see: + + ``` NAME READY STATUS RESTARTS AGE elasticsearch-master-0 1/1 Running 0 6m58s kibana-kibana-95bc54b89-zqdrk 1/1 Running 0 4m21s @@ -78,7 +83,12 @@ tags: ["logs","observability"] 2. Ensure that Fluentd is running as a daemonset. The number of Fluentd instances should be the same as the number of cluster nodes. In the example below, there is only one node in the cluster: ```bash - $ kubectl get pods -n kube-system -w + kubectl get pods -n kube-system -w + ``` + + You should see: + + ``` NAME READY STATUS RESTARTS AGE coredns-6955765f44-cxjxk 1/1 Running 0 4m41s coredns-6955765f44-jlskv 1/1 Running 0 4m41s @@ -105,46 +115,51 @@ _Note: There is a small delay for Elastic Search to index the logs that Fluentd 1. Port-forward from localhost to `svc/kibana-kibana` ```bash - $ kubectl port-forward svc/kibana-kibana 5601 -n radius-monitoring + kubectl port-forward svc/kibana-kibana 5601 -n radius-monitoring + ``` + + You should see: + + ``` Forwarding from 127.0.0.1:5601 -> 5601 Forwarding from [::1]:5601 -> 5601 Handling connection for 5601 Handling connection for 5601 ``` -2. Browse to `http://localhost:5601` +1. Browse to `http://localhost:5601` -3. Expand the drop-down menu and click **Management β†’ Stack Management** +2. Expand the drop-down menu and click **Management β†’ Stack Management** ![Stack Management item under Kibana Management menu options](kibana-1.png) -4. On the Stack Management page, select **Data β†’ Index Management** and wait until `radius-*` is indexed. +3. On the Stack Management page, select **Data β†’ Index Management** and wait until `radius-*` is indexed. ![Index Management view on Kibana Stack Management page](kibana-2.png) -5. Once `radius-*` is indexed, click on **Kibana β†’ Index Patterns** and then the **Create index pattern** button. +4. Once `radius-*` is indexed, click on **Kibana β†’ Index Patterns** and then the **Create index pattern** button. ![Kibana create index pattern button](kibana-3.png) -6. Define a new index pattern by typing `radius*` into the **Index Pattern name** field, then click the **Next step** button to continue. +5. Define a new index pattern by typing `radius*` into the **Index Pattern name** field, then click the **Next step** button to continue. ![Kibana define an index pattern page](kibana-4.png) -7. Configure the primary time field to use with the new index pattern by selecting the `@timestamp` option from the **Time field** drop-down. Click the **Create index pattern** button to complete creation of the index pattern. +6. Configure the primary time field to use with the new index pattern by selecting the `@timestamp` option from the **Time field** drop-down. Click the **Create index pattern** button to complete creation of the index pattern. ![Kibana configure settings page for creating an index pattern](kibana-5.png) -8. The newly created index pattern should be shown. Confirm that the fields of interest such as `scope`, `type`, `app_id`, `level`, etc. are being indexed by using the search box in the **Fields** tab. +7. The newly created index pattern should be shown. Confirm that the fields of interest such as `scope`, `type`, `app_id`, `level`, etc. are being indexed by using the search box in the **Fields** tab. _Note: If you cannot find the indexed field, please wait. The time it takes to search across all indexed fields depends on the volume of data and size of the resource that the elastic search is running on._ ![View of created Kibana index pattern](kibana-6.png) -9. To explore the indexed data, expand the drop-down menu and click **Analytics β†’ Discover**. +8. To explore the indexed data, expand the drop-down menu and click **Analytics β†’ Discover**. ![Discover item under Kibana Analytics menu options](kibana-7.png) -10. In the search box, type in a query string such as `scope:*` and click the **Refresh** button to view the results. +9. In the search box, type in a query string such as `scope:*` and click the **Refresh** button to view the results. _Note: This can take a long time. The time it takes to return all results depends on the volume of data and size of the resource that the elastic search is running on._ From 6d23914e0cd8edf63bfdadeb1c56ac7dff32a7f1 Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Mon, 16 Oct 2023 18:29:41 -0400 Subject: [PATCH 16/52] Add how to guide on Secret stores (#834) * Add supported resource types * Add how-to secret store * Split into two howto-s * Fix ref * Updates * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Adddress feedback * Address feedback --------- Co-authored-by: Aaron Crawfis --- .../secrets/howto-new-secretstore/index.md | 51 +++++++++++++++++++ .../snippets/secretstore.bicep | 30 +++++++++++ .../author-apps/secrets/overview/index.md | 13 ++--- 3 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 docs/content/guides/author-apps/secrets/howto-new-secretstore/index.md create mode 100644 docs/content/guides/author-apps/secrets/howto-new-secretstore/snippets/secretstore.bicep diff --git a/docs/content/guides/author-apps/secrets/howto-new-secretstore/index.md b/docs/content/guides/author-apps/secrets/howto-new-secretstore/index.md new file mode 100644 index 000000000..5f9e0c67c --- /dev/null +++ b/docs/content/guides/author-apps/secrets/howto-new-secretstore/index.md @@ -0,0 +1,51 @@ +--- +type: docs +title: "How To: Create new Secret Store" +linkTitle: "New Secret Store" +description: "Learn how to create new secrets in your Radius Application" +weight: 200 +categories: "How-To" +tags: ["secrets"] +--- + +Radius secret stores securely manage secrets for your Environment and Application. + +By default, Radius leverages the hosting platform's secrets management solution to create and store the secret. For example, if you are deploying to Kubernetes, the secret store will be created as a Kubernetes Secret. + +## Pre-requisites + +- [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) +- [kubectl CLI](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +- [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-radius-bicep-vs-code-extension" >}}) +- [Radius environment]({{< ref "installation#step-3-initialize-the-radius-control-plane-and-the-radius-environment" >}}) + +## Step 1: Add a Secret Store + +Open the `app.bicep` from the current working directory and add a new Secret Store resource + +{{< rad file="snippets/secretstore.bicep" embed=true marker="//SECRET_STORE_NEW" >}} + +In this example a new secret store resource is created for storing a TLS certificate in it. + +## Step 2: Deploy the application + +Deploy the application with [`rad deploy`]({{< ref "rad_deploy" >}}): + +```bash +rad deploy app.bicep -a secretdemo +``` + +## Step 3: Verify the secrets are deployed + +Use the below command to verify if the secret got deployed + +```bash +kubectl get secret -n default-secretdemo +``` + +You will find `appCert` of type kubernetes.io/tls automatically created. + +## Further reading + +- [Secret store schema]({{< ref secretstore >}}) +- [How To: gateway TLS termination]({{< ref howto-tls >}}) diff --git a/docs/content/guides/author-apps/secrets/howto-new-secretstore/snippets/secretstore.bicep b/docs/content/guides/author-apps/secrets/howto-new-secretstore/snippets/secretstore.bicep new file mode 100644 index 000000000..274580b63 --- /dev/null +++ b/docs/content/guides/author-apps/secrets/howto-new-secretstore/snippets/secretstore.bicep @@ -0,0 +1,30 @@ +import radius as radius + +@description('The app ID of your Radius Application. Set automatically by the rad CLI.') +param application string + +//SECRET_STORE_NEW +@description('The data for your TLS certificate') +@secure() +param tlscrt string + +@description('The key for your TLS certificate') +@secure() +param tlskey string + +resource appCert 'Applications.Core/secretStores@2023-10-01-preview' = { + name: 'appcert' + properties:{ + application: application + type: 'certificate' + data: { + 'tls.key': { + value: tlskey + } + 'tls.crt': { + value: tlscrt + } + } + } +} +//SECRET_STORE_NEW diff --git a/docs/content/guides/author-apps/secrets/overview/index.md b/docs/content/guides/author-apps/secrets/overview/index.md index 745517867..fba40d2c3 100644 --- a/docs/content/guides/author-apps/secrets/overview/index.md +++ b/docs/content/guides/author-apps/secrets/overview/index.md @@ -3,7 +3,7 @@ type: docs title: "Overview: Secrets management" linkTitle: "Overview" description: "Learn how to create and reference secrets in your Radius Application" -weight: 500 +weight: 100 categories: "Overview" tags: ["secrets"] --- @@ -14,17 +14,14 @@ Sensitive data, such as TLS certificates, tokens, passwords, and keys that serve An independent resource with its own lifecycle, a Radius Secret Store ensures that data is persisted across container restarts or mounts and can interact directly with the Radius Application Model. For instance, an Applications.Core/gateways resource can use this resource to store a TLS certificate and reference it. -## Create a new Secret Store +## Create a new Secret Store -Here is an example for creating a new Secret Store resource and storing a TLS certificate in it. Radius leverages the secrets management solution available on the hosting platform to create and store the secret. For example, if you are deploying to Kubernetes, the secret will be created in Kubernetes Secrets. - -{{< rad file="snippets/secretstore.bicep" embed=true marker="//SECRET_STORE_NEW" >}} +Radius leverages the secrets management solution available on the hosting platform to create and store the secret. For example, if you are deploying to Kubernetes, the secret will be created in Kubernetes Secrets. +Follow the [how-to guide on creating new secret store]({{< ref "/guides/author-apps/secrets/howto-new-secretstore" >}}) to learn more about creating a new secret store resource and storing a TLS certificate in it. ## Reference an existing Secret Store -Here is an example of using a Secret Store to reference secrets stores in an existing secrets management solution that is external to the Radius Application stack. Note that only references to Kubernetes Secrets is currently supported, with more to come in the future. - -{{< rad file="snippets/secretstore.bicep" embed=true marker="//SECRET_STORE_REF" >}} +You can also reference an existing secrets management solution that is external to the Radius Application stack. Note that only references to Kubernetes Secrets is currently supported, with more to come in the future. ## Using Secret Stores From 61a80b39e49932b40c8254de0c10a7e28d1cfdd4 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 16 Oct 2023 15:49:12 -0700 Subject: [PATCH 17/52] Fix installation instructions Signed-off-by: Aaron Crawfis --- .../installation/rad-cli/install-rad-cli.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/shared-content/installation/rad-cli/install-rad-cli.md b/docs/shared-content/installation/rad-cli/install-rad-cli.md index 1172eafc5..4d8301a51 100644 --- a/docs/shared-content/installation/rad-cli/install-rad-cli.md +++ b/docs/shared-content/installation/rad-cli/install-rad-cli.md @@ -9,11 +9,12 @@ wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash ``` {{< /latest >}} {{< edge >}} -To install the latest edge version: -```bash -wget -q "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" -O - | /bin/bash -s edge -``` +1. Visit the [GitHub Actions runs](https://github.com/radius-project/radius/actions/workflows/build.yaml?query=branch%3Amain+event%3Apush) +1. Click on the latest successful run +1. Scroll down to Artifacts and download `rad_cli_release` +1. Extract the archive and run the rad binary applicable for your machine + {{< /edge >}} {{% /codetab %}} @@ -24,11 +25,12 @@ curl -fsSL "https://get.radapp.dev/tools/rad/install.sh" | /bin/bash ``` {{< /latest >}} {{< edge >}} -To install the latest edge version: -```bash -curl -fsSL "https://radiuspublic.blob.core.windows.net/tools/rad/install.sh" | /bin/bash -s edge -``` +1. Visit the [GitHub Actions runs](https://github.com/radius-project/radius/actions/workflows/build.yaml?query=branch%3Amain+event%3Apush) +1. Click on the latest successful run +1. Scroll down to Artifacts and download `rad_cli_release` +1. Extract the archive and run the rad binary applicable for your machine + {{< /edge >}} {{% /codetab %}} @@ -46,11 +48,12 @@ $Env:Path = [System.Environment]::GetEnvironmentVariable("Path","User") ``` {{< /latest >}} {{< edge >}} -To install the latest edge version: -```powershell -$script=iwr -useb https://radiuspublic.blob.core.windows.net/tools/rad/install.ps1; $block=[ScriptBlock]::Create($script); invoke-command -ScriptBlock $block -ArgumentList edge -``` +1. Visit the [GitHub Actions runs](https://github.com/radius-project/radius/actions/workflows/build.yaml?query=branch%3Amain+event%3Apush) +1. Click on the latest successful run +1. Scroll down to Artifacts and download `rad_cli_release` +1. Extract the archive and run the rad binary applicable for your machine + {{< /edge >}} {{% /codetab %}} @@ -77,12 +80,9 @@ PowerShell for Cloud Shell is currently not supported. {{% /codetab %}} {{% codetab %}} -1. Download the `rad` CLI from one of these URLs: - - MacOS x64: https://get.radapp.dev/tools/rad/{{< param version >}}/macos-x64/rad - - MacOS arm64: https://get.radapp.dev/tools/rad/{{< param version >}}/macos-arm64/rad - - Linux x64: https://get.radapp.dev/tools/rad/{{< param version >}}/linux-x64/rad - - Windows x64: https://get.radapp.dev/tools/rad/{{< param version >}}/windows-x64/rad.exe -1. Ensure the user has permission to execute the binary and place it somewhere on your PATH so it can be invoked easily. + +Visit [Radius GitHub releases](https://github.com/radius-project/radius/releases) to select and download a specific version of the rad CLI. + {{% /codetab %}} {{< /tabs >}} From aa67d6ee442db38fc80634bebaa79bbd1bc5ee12 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 16 Oct 2023 20:20:14 -0700 Subject: [PATCH 18/52] Add pre-requisites Signed-off-by: Aaron Crawfis --- .../guides/operations/control-plane/metrics/grafana/index.md | 2 ++ .../guides/operations/control-plane/traces/jaeger/index.md | 4 ++++ .../guides/operations/control-plane/traces/zipkin/index.md | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/docs/content/guides/operations/control-plane/metrics/grafana/index.md b/docs/content/guides/operations/control-plane/metrics/grafana/index.md index 8fb41126d..b67d78f82 100644 --- a/docs/content/guides/operations/control-plane/metrics/grafana/index.md +++ b/docs/content/guides/operations/control-plane/metrics/grafana/index.md @@ -35,6 +35,8 @@ The [radius-resource-provider-dashboard.json](https://get.radapp.dev/tools/grafa ### Pre-requisites - [Setup Prometheus]({{}}) on your Kubernetes cluster +- [Helm 3](https://helm.sh/) + ### Install Grafana diff --git a/docs/content/guides/operations/control-plane/traces/jaeger/index.md b/docs/content/guides/operations/control-plane/traces/jaeger/index.md index 6c4ebb6ec..895d982f1 100644 --- a/docs/content/guides/operations/control-plane/traces/jaeger/index.md +++ b/docs/content/guides/operations/control-plane/traces/jaeger/index.md @@ -12,6 +12,10 @@ tags: ["tracing", "observability"] The following steps show you how to configure the Radius control plane to send distributed tracing data to Jaeger running as a container in your Kubernetes cluster and how to view the data. +## Pre-requisites + +- [kubectl CLI](https://kubernetes.io/docs/tasks/tools/) + ## Step 1: Install Jaeger on Kubernetes 1. Create the namespace `radius-monitoring`: diff --git a/docs/content/guides/operations/control-plane/traces/zipkin/index.md b/docs/content/guides/operations/control-plane/traces/zipkin/index.md index 625364d35..df99eba3c 100644 --- a/docs/content/guides/operations/control-plane/traces/zipkin/index.md +++ b/docs/content/guides/operations/control-plane/traces/zipkin/index.md @@ -12,6 +12,10 @@ tags: ["tracing", "observability"] The following steps show you how to configure the [Radius control plane]({{< ref architecture-concept >}}) components to send distributed tracing data to Zipkin running as a container in your Kubernetes cluster and how to view the data. +## Pre-requisites + +- [kubectl CLI](https://kubernetes.io/docs/tasks/tools/) + ## Step 1: Install Zipkin on Kubernetes 1. Create the namespace `radius-monitoring`: From d2816070eb37cc75c8162c13266b692a8d9b399b Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Tue, 17 Oct 2023 11:12:08 -0400 Subject: [PATCH 19/52] Update api-ucp.md (#859) --- docs/content/reference/api/api-ucp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/reference/api/api-ucp.md b/docs/content/reference/api/api-ucp.md index 5a19e6e59..8608c9a30 100644 --- a/docs/content/reference/api/api-ucp.md +++ b/docs/content/reference/api/api-ucp.md @@ -5,4 +5,4 @@ linkTitle: "UCP" description: "Detailed reference documentation on the UCP API" --- -{{< redoc "swagger/specification/ucp/resource-manager/UCP/preview/2022-09-01-privatepreview/openapi.json" >}} +{{< redoc "swagger/specification/ucp/resource-manager/UCP/preview/2023-10-01-preview/openapi.json" >}} From c6c457adb08ef64ec66322f589f147a772e3813a Mon Sep 17 00:00:00 2001 From: Shruthi Kumar Date: Tue, 17 Oct 2023 09:51:11 -0700 Subject: [PATCH 20/52] Update index.md (#858) * Update index.md Update to verify Helm installation * nit Co-authored-by: Aaron Crawfis * Spellcheck Signed-off-by: Aaron Crawfis --------- Signed-off-by: Aaron Crawfis Co-authored-by: Aaron Crawfis --- .github/config/en-custom.txt | 1 + .../guides/author-apps/azure/howto-azure-resources/index.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/config/en-custom.txt b/.github/config/en-custom.txt index 757d04ec1..346d2311b 100644 --- a/.github/config/en-custom.txt +++ b/.github/config/en-custom.txt @@ -958,3 +958,4 @@ composable CRD nd OSI +Webhook diff --git a/docs/content/guides/author-apps/azure/howto-azure-resources/index.md b/docs/content/guides/author-apps/azure/howto-azure-resources/index.md index 40bad9560..a21fb0a73 100644 --- a/docs/content/guides/author-apps/azure/howto-azure-resources/index.md +++ b/docs/content/guides/author-apps/azure/howto-azure-resources/index.md @@ -22,7 +22,7 @@ The steps below will showcase a "rad-ified" version of the existing [Azure AD wo - [rad CLI]({{< ref "installation#step-1-install-the-rad-cli" >}}) - [Radius Bicep VSCode extension]({{< ref "installation#step-2-install-the-vs-code-extension" >}}) - [Setup a supported Kubernetes cluster]({{< ref "/guides/operations/kubernetes/overview#supported-clusters" >}}) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/installation.html) installed in your cluster +- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/installation.html) installed in your cluster, including the [Mutating Admission Webhook](https://azure.github.io/azure-workload-identity/docs/installation/mutating-admission-webhook.html) ## Step 1: Initialize Radius From 6b55028723d3ea706d2d02a5a436a7693c20127f Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Tue, 17 Oct 2023 11:14:08 -0700 Subject: [PATCH 21/52] Update title Signed-off-by: Aaron Crawfis --- docs/content/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/_index.md b/docs/content/_index.md index 799d0faa9..a4b9a460a 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -1,6 +1,6 @@ --- type: docs -title: "Radius Cloud-Native Application Platform" +title: "Radius Documentation" linkTitle: "Home" description: "Radius enables developers and the platform engineers that support them to build cloud-native applications" weight: 1 From 28703d4ecd31d40b652f2cee1dc7c113d9f943b2 Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:11:42 -0400 Subject: [PATCH 22/52] Add docs to install Radius Bicep extension from VSCode marketplace (#865) * Add docs to install Radius Bicep extension from VSCode marketplace * Revert wrong upd * Revert upd to initialize * Update docs/shared-content/installation/install-radius/initialize-radius.md * Update docs/shared-content/installation/vscode-bicep/install-vscode-bicep.md Co-authored-by: Aaron Crawfis --------- Co-authored-by: Aaron Crawfis --- .../vscode-bicep/images/radius-bicep.png | Bin 0 -> 103458 bytes .../vscode-bicep/install-vscode-bicep.md | 58 +++++------------- 2 files changed, 15 insertions(+), 43 deletions(-) create mode 100644 docs/shared-content/installation/vscode-bicep/images/radius-bicep.png diff --git a/docs/shared-content/installation/vscode-bicep/images/radius-bicep.png b/docs/shared-content/installation/vscode-bicep/images/radius-bicep.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3776cf119d5070d43c86d68de65a842101f7a0 GIT binary patch literal 103458 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

OB+b;(` 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 gr&TiInmYgamtBpR&v}} +You can only have one VSCode Bicep extension installed at a time. To build on Radius, you will need to uninstall the official Bicep and use only the Radius Bicep extension. +{{< /alert >}} - {{< tabs Links Terminal >}} +1. To install the Radius Bicep extension, search for Radius Bicep in the Extensions tab in VSCode or in the [Visual Studio marketplace](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.rad-vscode-bicep&ssr=false#overview) - {{% codetab %}} - {{< button link="https://get.radapp.dev/tools/vscode-extensibility/stable/rad-vscode-bicep.vsix" text="Download Bicep extension" >}} + Screenshot of Radius Bicep extension in VSCode Marketplace - {{< edge >}} - {{< button link="https://get.radapp.dev/tools/vscode-extensibility/edge/rad-vscode-bicep.vsix" text="Download Bicep extension (edge)" >}} - {{< /edge >}} - {{% /codetab %}} +2. Select Install - {{% codetab %}} +To verify you've installed the extension, open any file with the .bicep file extension and start [authoring Radius application]({{< ref author-apps >}}) to verify the auto-complete and other validation features. - Stable Version - - ```bash - curl https://get.radapp.dev/tools/vscode-extensibility/stable/rad-vscode-bicep.vsix --output rad-vscode-bicep.vsix - ``` - - Edge Version - - ```bash - curl https://get.radapp.dev/tools/vscode-extensibility/edge/rad-vscode-bicep.vsix --output rad-vscode-bicep.vsix - ``` - - {{% /codetab %}} - - {{< /tabs >}} - -2. Install the `.vsix` file: - - {{< tabs UI Terminal >}} - - {{% codetab %}} +{{< edge >}} +1. Visit the [GitHub Actions runs](https://github.com/radius-project/bicep/actions/workflows/radius-build.yml?query=event%3Apush+branch%3Abicep-extensibility) +2. Click on the latest successful run +3. Scroll down to Artifacts and download `release` +4. Extract the archive and Install the `rad-vscode-bicep.vsix` file: In VSCode, manually install the extension using the *Install from VSIX* command in the Extensions view command drop-down. Screenshot of installing a vsix extension - - - {{% /codetab %}} - - {{% codetab %}} + You can also import this extension on the [command-line](https://code.visualstudio.com/docs/editor/extension-gallery#_install-from-a-vsix) with: ```bash code --install-extension rad-vscode-bicep.vsix ``` - If you're on macOS, make sure to [setup the `code` alias](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line). - {{% /codetab %}} - - {{< /tabs >}} - -3. **Disable the official Bicep extension** if you have it installed. Do not install it if prompted, our custom extension needs to be responsible for handling `.bicep` files and you cannot have both extensions enabled at once. - -4. If running on Windows Subsystem for Linux (WSL), make sure to install the extension in WSL as well: +5. If running on Windows Subsystem for Linux (WSL), make sure to install the extension in WSL as well: Screenshot of installing a vsix extension in WSL +{{< /edge >}} From 72d178db0b435021a2dfd3cb9105cefc730043b1 Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Tue, 17 Oct 2023 20:28:04 -0400 Subject: [PATCH 23/52] Update get.radapp.dev references (#866) --- .../deploy-apps/howto-deploy/howto-deploy-cicd/index.md | 2 +- .../operations/control-plane/metrics/grafana/index.md | 8 ++++---- .../installation/rad-cli/install-rad-cli.md | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md b/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md index 015451140..1cedabc3d 100644 --- a/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md +++ b/docs/content/guides/deploy-apps/howto-deploy/howto-deploy-cicd/index.md @@ -97,7 +97,7 @@ Next, download the latest `rad` CLI release and setup your workspace: ```yml - name: Download rad CLI and rad-bicep run: | - wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash + wget -q "https://raw.githubusercontent.com/radius-project/radius/main/deploy/install.sh" -O - | /bin/bash ./rad bicep download ./rad --version - name: Initialize Radius Environment diff --git a/docs/content/guides/operations/control-plane/metrics/grafana/index.md b/docs/content/guides/operations/control-plane/metrics/grafana/index.md index b67d78f82..9b45528fb 100644 --- a/docs/content/guides/operations/control-plane/metrics/grafana/index.md +++ b/docs/content/guides/operations/control-plane/metrics/grafana/index.md @@ -16,7 +16,7 @@ There are two example dashboards that you can import into Grafana to quickly get ### Control plane overview -The [radius-overview-dashboard.json](https://get.radapp.dev/tools/grafana/radius-overview-dashboard.json) template shows Radius and Deployment Engine statuses, including runtime, and server-side health: +The [radius-overview-dashboard.json](https://raw.githubusercontent.com/radius-project/radius/main/grafana/radius-overview-dashboard.json) template shows Radius and Deployment Engine statuses, including runtime, and server-side health: 1st screenshot of the Radius Overview Dashboard
@@ -24,7 +24,7 @@ The [radius-overview-dashboard.json](https://get.radapp.dev/tools/grafana/radius ### Resource provider overview -The [radius-resource-provider-dashboard.json](https://get.radapp.dev/tools/grafana/radius-resource-provider-dashboard.json) template shows Radius Resource Provider status, including runtime, server-side, and operations health: +The [radius-resource-provider-dashboard.json](https://raw.githubusercontent.com/radius-project/radius/main/grafana/radius-resource-provider-dashboard.json) template shows Radius Resource Provider status, including runtime, server-side, and operations health: 1st screenshot of the Radius Resource Provider Dashboard
@@ -135,8 +135,8 @@ Now that Grafana is installed, you need to configure it to use Prometheus as a d ### Import dashboards in Grafana 1. Download the Grafana dashboard templates: - - [radius-overview-dashboard.json](https://get.radapp.dev/tools/grafana/radius-overview-dashboard.json) - - [radius-resource-provider-dashboard.json](https://get.radapp.dev/tools/grafana/radius-resource-provider-dashboard.json) + - [radius-overview-dashboard.json](https://raw.githubusercontent.com/radius-project/radius/main/grafana/radius-overview-dashboard.json) + - [radius-resource-provider-dashboard.json](https://raw.githubusercontent.com/radius-project/radius/main/grafana/radius-resource-provider-dashboard.json) 1. In the upper left corner of the Grafana home screen, click the "+" option, then "Import", and select your templates. 1. Select the dashboard that you imported and enjoy! diff --git a/docs/shared-content/installation/rad-cli/install-rad-cli.md b/docs/shared-content/installation/rad-cli/install-rad-cli.md index b7870da21..130c111cf 100644 --- a/docs/shared-content/installation/rad-cli/install-rad-cli.md +++ b/docs/shared-content/installation/rad-cli/install-rad-cli.md @@ -5,7 +5,7 @@ The `rad` CLI manages your applications, resources, and environments. You can in {{% codetab %}} {{< latest >}} ```bash -wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash +wget -q "https://raw.githubusercontent.com/radius-project/radius/main/deploy/install.sh" -O - | /bin/bash ``` {{< /latest >}} {{< edge >}} @@ -21,7 +21,7 @@ wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash {{% codetab %}} {{< latest >}} ```bash -curl -fsSL "https://get.radapp.dev/tools/rad/install.sh" | /bin/bash +curl -fsSL "https://raw.githubusercontent.com/radius-project/radius/main/deploy/install.sh" | /bin/bash ``` {{< /latest >}} {{< edge >}} @@ -39,7 +39,7 @@ curl -fsSL "https://get.radapp.dev/tools/rad/install.sh" | /bin/bash Run the following in a PowerShell window: ```powershell -iwr -useb "https://get.radapp.dev/tools/rad/install.ps1" | iex +iwr -useb "https://raw.githubusercontent.com/radius-project/radius/main/deploy/install.ps1" | iex ``` You may need to refresh your $PATH environment variable to access `rad`: @@ -71,7 +71,7 @@ Azure Cloud Shell for bash doesn't have a sudo command, so users are unable to i ```bash export RADIUS_INSTALL_DIR=./ -wget -q "https://get.radapp.dev/tools/rad/install.sh" -O - | /bin/bash +wget -q "https://raw.githubusercontent.com/radius-project/radius/main/deploy/install.sh" -O - | /bin/bash ``` You can now run the rad CLI with `./rad`. From a4730d9c5a37cd5b839856233189641ded90fdd4 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Tue, 17 Oct 2023 18:40:13 -0700 Subject: [PATCH 24/52] Switch to radapp.io Signed-off-by: Aaron Crawfis --- .github/ISSUE_TEMPLATE/typo.md | 2 +- .github/pull_request_template.md | 2 +- .github/scripts/algolia.py | 2 +- .github/scripts/release-docs.sh | 4 ++-- .github/workflows/spellcheck.yaml | 4 ++-- .github/workflows/website.yaml | 6 +++--- CONTRIBUTING.md | 2 +- README.md | 8 ++++---- docs/README.md | 2 +- docs/config.toml | 10 +++++----- docs/content/_index.md | 2 +- docs/content/reference/limitations.md | 2 +- .../resource-schema/core-schema/gateway/index.md | 2 +- .../core-schema/gateway/snippets/gateway.bicep | 2 +- docs/layouts/shortcodes/edge.html | 2 +- docs/layouts/shortcodes/latest.html | 2 +- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/typo.md b/.github/ISSUE_TEMPLATE/typo.md index 56a7cc148..705d20960 100644 --- a/.github/ISSUE_TEMPLATE/typo.md +++ b/.github/ISSUE_TEMPLATE/typo.md @@ -7,7 +7,7 @@ assignees: '' --- **URL of the docs page** - + **How is it currently worded?** diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3d2a5b928..615442fff 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,7 +2,7 @@ Thank you for helping make the Radius documentation better! **Please follow this checklist before submitting:** -- [ ] [Read the contribution guide](https://docs.radapp.dev/community/contributing/docs/) +- [ ] [Read the contribution guide](https://docs.radapp.io/community/contributing/docs/) - [ ] Commands include options for Linux, MacOS, and Windows within codetabs - [ ] New file and folder names are globally unique - [ ] Page references use shortcodes instead of markdown or URL links diff --git a/.github/scripts/algolia.py b/.github/scripts/algolia.py index 7ee94513d..e453320ca 100644 --- a/.github/scripts/algolia.py +++ b/.github/scripts/algolia.py @@ -5,7 +5,7 @@ from bs4 import BeautifulSoup from algoliasearch.search_client import SearchClient -url = "docs.radapp.dev" +url = "docs.radapp.io" if len(sys.argv) > 1: starting_directory = os.path.join(os.getcwd(), str(sys.argv[1])) else: diff --git a/.github/scripts/release-docs.sh b/.github/scripts/release-docs.sh index fcc4eafda..4117c7cf1 100755 --- a/.github/scripts/release-docs.sh +++ b/.github/scripts/release-docs.sh @@ -44,8 +44,8 @@ pushd $REPOSITORY git checkout -B "${CHANNEL_VERSION}" -# In docs/config.toml, change baseURL to https://docs.radapp.dev/ instead of https://edge.docs.radapp.dev/ -awk '{gsub(/baseURL = \"https:\/\/edge\.docs\.radapp.dev\/\"/,"baseURL = \"https:\/\/docs.radapp.dev\/\""); print}' docs/config.toml > docs/config.toml.tmp +# In docs/config.toml, change baseURL to https://docs.radapp.io/ instead of https://edge.docs.radapp.io/ +awk '{gsub(/baseURL = \"https:\/\/edge\.docs\.radapp.io\/\"/,"baseURL = \"https:\/\/docs.radapp.io\/\""); print}' docs/config.toml > docs/config.toml.tmp mv docs/config.toml.tmp docs/config.toml # In docs/config.toml, change version to VERSION instead of edge diff --git a/.github/workflows/spellcheck.yaml b/.github/workflows/spellcheck.yaml index 1e0530acf..0926f55b3 100644 --- a/.github/workflows/spellcheck.yaml +++ b/.github/workflows/spellcheck.yaml @@ -35,7 +35,7 @@ jobs: echo "## :x: Spellcheck Failed" >> $GITHUB_STEP_SUMMARY echo "There are spelling errors in your PR. Visit [the workflow output](${{ env.ACTION_LINK }}) to see what words are failing." >> $GITHUB_STEP_SUMMARY echo "### Adding new words" >> $GITHUB_STEP_SUMMARY - echo "If you are adding a new custom word refer to the [docs guide](https://docs.radapp.dev/contributing/docs/#spelling)" >> $GITHUB_STEP_SUMMARY + echo "If you are adding a new custom word refer to the [docs guide](https://docs.radapp.io/contributing/docs/#spelling)" >> $GITHUB_STEP_SUMMARY - name: Post GitHub workflow output on success run: | echo "## :white_check_mark: Spellcheck Passed" >> $GITHUB_STEP_SUMMARY @@ -50,7 +50,7 @@ jobs: ## :x: Spellcheck Failed There are spelling errors in your PR. Visit [the workflow output](${{ env.ACTION_LINK }}) to see what words are failing. ### Adding new words - If you are adding a new custom word refer to the [docs guide](https://docs.radapp.dev/contributing/docs/#spelling) + If you are adding a new custom word refer to the [docs guide](https://docs.radapp.io/contributing/docs/#spelling) - name: Clear GitHub comment on success uses: marocchino/sticky-pull-request-comment@v2 continue-on-error: true diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 3a464a2d8..830cab0e5 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -80,7 +80,7 @@ jobs: runs-on: ubuntu-latest environment: name: ${{ github.ref_name == 'edge' && 'edge' || 'latest' }} - url: ${{ github.ref_name == 'edge' && 'https://edge.docs.radapp.dev' || 'https://docs.radapp.dev' }} + url: ${{ github.ref_name == 'edge' && 'https://edge.docs.radapp.io' || 'https://docs.radapp.io' }} steps: - name: Checkout docs repo uses: actions/checkout@v3 @@ -111,7 +111,7 @@ jobs: runs-on: ubuntu-latest environment: name: ${{ github.ref_name == 'edge' && 'edge' || 'latest' }} - url: ${{ github.ref_name == 'edge' && 'https://edge.docs.radapp.dev' || 'https://docs.radapp.dev' }} + url: ${{ github.ref_name == 'edge' && 'https://edge.docs.radapp.io' || 'https://docs.radapp.io' }} steps: - name: Download Hugo artifacts uses: actions/download-artifact@v3 @@ -152,7 +152,7 @@ jobs: runs-on: ubuntu-latest environment: name: ${{ github.ref_name == 'edge' && 'edge' || 'latest' }} - url: ${{ github.ref_name == 'edge' && 'https://edge.docs.radapp.dev' || 'https://docs.radapp.dev' }} + url: ${{ github.ref_name == 'edge' && 'https://edge.docs.radapp.io' || 'https://docs.radapp.io' }} steps: - name: Close Pull Request id: closepullrequest diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c657af86b..c1015e254 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ # Contributing to Radius documentation -Thank you for your interesting in contributing to the Radius documentation! For more information please refer to [https://docs.radapp.dev/community/contributing/docs/](https://docs.radapp.dev/community/contributing/docs/) +Thank you for your interesting in contributing to the Radius documentation! For more information please refer to [https://docs.radapp.io/community/contributing/docs/](https://docs.radapp.io/community/contributing/docs/) diff --git a/README.md b/README.md index 7b51a9658..85588b5a0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # πŸ“• Radius documentation -This repo contains the documentation source for https://radapp.dev +This repo contains the documentation source for https://radapp.io ## πŸ“¦ Framework @@ -16,7 +16,7 @@ The [rad CLI](https://github.com/radius-project/radius/tree/main/cmd/rad) refere ## πŸ‘¨β€πŸ’» Contributing -Visit the [docs contribution guide](https://radapp.dev/contributing/contributing-docs/) to learn how to contribute to the docs. +Visit the [docs contribution guide](https://radapp.io/contributing/contributing-docs/) to learn how to contribute to the docs. ### Local server @@ -28,11 +28,11 @@ The Radius docs are hosted on Azure App Service. ### Latest docs -The latest release docs are available at https://radapp.dev +The latest release docs are available at https://radapp.io ### Edge docs -Edge docs are available at https://edge.radapp.dev +Edge docs are available at https://edge.radapp.io ### Staging docs diff --git a/docs/README.md b/docs/README.md index afeacf412..8c464447d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # Radius documentation -This directory contains the files to generate the https://docs.radapp.dev site. Please go there to consume Radius docs. This document will describe how to build Radius docs locally. +This directory contains the files to generate the https://docs.radapp.io site. Please go there to consume Radius docs. This document will describe how to build Radius docs locally. ## Codespace diff --git a/docs/config.toml b/docs/config.toml index 83cf70593..90ad2a6fd 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -1,4 +1,4 @@ -baseURL = "https://docs.radapp.dev/" +baseURL = "https://docs.radapp.io/" languageCode = "en-us" title = "Radius Docs" theme = "docsy" @@ -47,7 +47,7 @@ tag = "tags" [[menu.main]] name = "Home" weight = 10 - url = "https://radapp.dev" + url = "https://radapp.io" pre = "" [[menu.main]] name = "GitHub" @@ -57,7 +57,7 @@ tag = "tags" [[menu.main]] name = "Discord" weight = 90 - url = "https://discord.gg/SRG3ePMKNy" + url = "https://aka.ms/Radius/Discord" pre = "" [params] @@ -80,11 +80,11 @@ github_project_repo = "https://github.com/radius-project/radius" version_menu = "Releases" [[params.versions]] version = "edge (preview)" - url = "https://edge.docs.radapp.dev" + url = "https://edge.docs.radapp.io" [[params.versions]] version = "latest" - url = "https://docs.radapp.dev" + url = "https://docs.radapp.io" # Markdown Engine - Allow inline html [markup] diff --git a/docs/content/_index.md b/docs/content/_index.md index a4b9a460a..38558bd1a 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -13,7 +13,7 @@ Welcome to the Radius documentation! Here you'll find everything you need to kno Radius logo

Radius is a cloud native application platform. It enables developers and IT operators to collaborate on delivering and managing cloud-native applications. With Radius, teams can easily understand their applications and how applications are running environments including dev, cloud, edge, and on-prem. Plus, teams can ensure their application infrastructure meets cost, operations, and security requirements. Open-source and multi-cloud, Radius is the cloud-native application platform for delivering and managing applications anywhere. -[**Learn more**](https://radapp.dev/) +[**Learn more**](https://radapp.io/) {{% /alert %}} {{< button text="Get started with Radius πŸš€" page="getting-started" color="success" size="btn-lg" >}} diff --git a/docs/content/reference/limitations.md b/docs/content/reference/limitations.md index 0e6cd31d2..3b7d0ddd9 100644 --- a/docs/content/reference/limitations.md +++ b/docs/content/reference/limitations.md @@ -90,6 +90,6 @@ Some of the [AWS resource types](/resource-schema/aws) are 'non-idempotent', thi We are currently building support for non-idempotent resources in Radius. Please like and comment on this [this issue](https://github.com/radius-project/radius/issues/6227) if you are interested in the same. -As a workaround, you can try using [Terraform Recipes](https://docs.radapp.dev/guides/recipes/overview/) to deploy and manage those non-idempotent resource types. +As a workaround, you can try using [Terraform Recipes]({{< ref "/guides/recipes/overview" >}}) to deploy and manage those non-idempotent resource types. diff --git a/docs/content/reference/resource-schema/core-schema/gateway/index.md b/docs/content/reference/resource-schema/core-schema/gateway/index.md index 4db8b2bdc..dee04bf88 100644 --- a/docs/content/reference/resource-schema/core-schema/gateway/index.md +++ b/docs/content/reference/resource-schema/core-schema/gateway/index.md @@ -49,7 +49,7 @@ You can define hostname information for how to access your application. See [bel | Key | Required | Description | Example | |------|:--------:|-------------|---------| | sslPassthrough | n | Configures the gateway to passthrough encrypted SSL traffic to an HTTP route and container. Requires a single route to be set with no 'path' defined (just destination). With sslPassthrough set to `true`, the gateway can only support SNI routing. Path based routing cannot be supported. Defaults to 'false'. | `true` -| hostname | n | The hostname for TLS termination. | `'hostname.radapp.dev'` +| hostname | n | The hostname for TLS termination. | `'hostname.radapp.io'` | certificateFrom | n | The Radius Secret Store resource ID that holds the TLS certificate data for TLS termination. | `secretstore.id` | minimumProtocolVersion | n | The minimum TLS protocol to support for TLS termination. | `'1.2'` diff --git a/docs/content/reference/resource-schema/core-schema/gateway/snippets/gateway.bicep b/docs/content/reference/resource-schema/core-schema/gateway/snippets/gateway.bicep index 399b4822a..eefc5fa15 100644 --- a/docs/content/reference/resource-schema/core-schema/gateway/snippets/gateway.bicep +++ b/docs/content/reference/resource-schema/core-schema/gateway/snippets/gateway.bicep @@ -20,7 +20,7 @@ resource gateway 'Applications.Core/gateways@2023-10-01-preview' = { // Results in prefix.appname.PUBLIC_HOSTNAME_OR_IP.nip.io prefix: 'prefix' // Alternately you can specify your own hostname that you've configured externally - fullyQualifiedHostname: 'hostname.radapp.dev' + fullyQualifiedHostname: 'hostname.radapp.io' } routes: [ { diff --git a/docs/layouts/shortcodes/edge.html b/docs/layouts/shortcodes/edge.html index f6ee2fc31..21dfea076 100644 --- a/docs/layouts/shortcodes/edge.html +++ b/docs/layouts/shortcodes/edge.html @@ -4,5 +4,5 @@ {{ if eq $version "edge" }} {{ $content }} {{ else }} -To try out an unstable release visit the [edge docs](https://edge.radapp.dev). +To try out an unstable release visit the [edge docs](https://edge.docs.radapp.io). {{ end }} diff --git a/docs/layouts/shortcodes/latest.html b/docs/layouts/shortcodes/latest.html index fe301a68a..73a7d87dc 100644 --- a/docs/layouts/shortcodes/latest.html +++ b/docs/layouts/shortcodes/latest.html @@ -4,5 +4,5 @@ {{ if ne $version "edge" }} {{ $content }} {{ else }} -To try out a stable release visit the [latest docs](https://radapp.dev). +To try out a stable release visit the [latest docs](https://docs.radapp.io). {{ end }} \ No newline at end of file From bd5b26a82407c06a0a779beb7f8ca477d2024259 Mon Sep 17 00:00:00 2001 From: Will <28876888+willtsai@users.noreply.github.com> Date: Tue, 17 Oct 2023 21:51:22 -0700 Subject: [PATCH 25/52] add link to blog (#875) Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> --- docs/config.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/config.toml b/docs/config.toml index 90ad2a6fd..979fde19e 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -49,6 +49,11 @@ tag = "tags" weight = 10 url = "https://radapp.io" pre = "" +[[menu.main]] + name = "Blog" + weight = 20 + url = "https://blog.radapp.io" + pre = "" [[menu.main]] name = "GitHub" weight = 40 From f42ee786725804e8b1c56a2012282736bd99076e Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Wed, 18 Oct 2023 09:22:55 -0700 Subject: [PATCH 26/52] Remove clarity AAD integration Signed-off-by: Aaron Crawfis --- docs/static/js/clarity.js | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 docs/static/js/clarity.js diff --git a/docs/static/js/clarity.js b/docs/static/js/clarity.js deleted file mode 100644 index 907712b98..000000000 --- a/docs/static/js/clarity.js +++ /dev/null @@ -1,20 +0,0 @@ -$(document).ready(function() { - $.ajax({ - type: "GET", - url: "/.auth/me", - success: function(data) { - if (data[0] && data[0].user_id) { - // Set identifier as hashed user id - window.clarity("identify", data[0].user_id); - - // If user_id contains microsoft.com, set internal to true - if (data[0].user_id.includes("microsoft.com")) { - window.clarity("set", "internal", "true"); - } - else { - window.clarity("set", "internal", "false"); - } - } - } - }); -}); From dbf0877d7d123ea971f30323ca0feb309ea6a832 Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Wed, 18 Oct 2023 16:11:33 -0400 Subject: [PATCH 27/52] Downmerge 10-18-2023 (#878) * Adding "Why Radius?" concept doc (#827) * Adding "Why Radius?" concept doc * Apply suggestions from code review Co-authored-by: Jonathan Smith Co-authored-by: Ryan Waite * More feedback * third draft --------- Co-authored-by: Jonathan Smith Co-authored-by: Ryan Waite * Update rad CLI documentation (#868) * Autogenerate rad CLI reference docs * Spellcheck --------- Co-authored-by: rad-ci-bot Co-authored-by: Aaron Crawfis * Autogenerate rad CLI reference docs (#872) Co-authored-by: rad-ci-bot * Autogenerate rad CLI reference docs (#873) Co-authored-by: rad-ci-bot * Autogenerate rad CLI reference docs (#874) Co-authored-by: rad-ci-bot * Upmerge 10-18-2023 (#877) * Merge edge to v0.26 (#838) * Add how-to guide on local dev recipes (#822) * Add supported resource types * Add how-to guideto use local dev recipes * Apply suggestions from code review Co-authored-by: Jonathan Smith * Update docs/content/guides/recipes/howto-dev-recipes/index.md * Adddress feedback * Address feedback * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Minor tweaks * minor tweaks --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis * Standardize pre-reqs for all how-tos (#836) * Standardixe pre-reqs for all how-tos * Update docs/content/guides/author-apps/azure/howto-azure-resources/index.md --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis * Sanitize docs for release references (#837) * Add how-to guide on local dev recipes (#822) * Add supported resource types * Add how-to guideto use local dev recipes * Apply suggestions from code review Co-authored-by: Jonathan Smith * Update docs/content/guides/recipes/howto-dev-recipes/index.md * Adddress feedback * Address feedback * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Minor tweaks * minor tweaks --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis * Sanitize docs for release references * Revert spelling fix * Apply suggestions from code review Co-authored-by: Aaron Crawfis --------- Co-authored-by: Jonathan Smith Co-authored-by: Aaron Crawfis * Add Codespace docs Signed-off-by: Aaron Crawfis * Update instructions for `How To Configure AWS Provider` (#839) * Fixing a typo from the rad install kubernetes command (#846) * Update pull_request_template.md (#844) * Update steps after port forward to view the contents of /tmpdir (#847) Update steps after port forward to view the contents of /tmpdir Co-authored-by: Aaron Crawfis * Updating the initialization verification doc (#843) Co-authored-by: Aaron Crawfis * Update index.md with '' instead of 'frontend' (#848) In commend to 'inspect container logs' update current value 'frontend' with a more generic '' similar to other commands in the document * Updating How To Connect Dependencies doc (#850) * Multi-cloud and OSS concept doc (#821) * 1st draft of multi-cloud and OSS concept doc * Fixing spelling errors * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Update to correct open-source spelling Co-authored-by: Aaron Crawfis * Changing doc weight to 100 per Aaron. Co-authored-by: Aaron Crawfis * Apply break after header Co-authored-by: Aaron Crawfis * Correct spelling error for "application" Co-authored-by: Ryan Nowak * Add blank line after heading Co-authored-by: Aaron Crawfis * Add blank line after heading Co-authored-by: Aaron Crawfis * Include Helm charts in description of deployment assets Co-authored-by: Ryan Nowak * Amazon S3 is not valid Dapr state store, so use DynamoDB instead Co-authored-by: Ryan Nowak * More substantial changes based on Nowak's feedback * Updating en-custom.txt spelling * Put the "Concept:" in quotes to prevent build errors Co-authored-by: Ryan Nowak * Get more specific about publicly available Co-authored-by: Ryan Nowak * Update docs/content/concepts/multi-cloud-concept/index.md Co-authored-by: Aaron Crawfis * Spellcheck --------- Co-authored-by: Aaron Crawfis Co-authored-by: Ryan Nowak * Update index.md (#854) Updating local dev recipes docs to use correct pod name * Update link to initialize page (#853) * Update link Signed-off-by: Aaron Crawfis * Update vscode link Signed-off-by: Aaron Crawfis --------- Signed-off-by: Aaron Crawfis * Update copy logic (#855) Signed-off-by: Aaron Crawfis * Fix code formatting (#856) * Add how to guide on Secret stores (#834) * Add supported resource types * Add how-to secret store * Split into two howto-s * Fix ref * Updates * Apply suggestions from code review Co-authored-by: Aaron Crawfis * Adddress feedback * Address feedback --------- Co-authored-by: Aaron Crawfis * Fix installation instructions Signed-off-by: Aaron Crawfis * Add pre-requisites Signed-off-by: Aaron Crawfis * Update api-ucp.md (#859) * Update index.md (#858) * Update index.md Update to verify Helm installation * nit Co-authored-by: Aaron Crawfis * Spellcheck Signed-off-by: Aaron Crawfis --------- Signed-off-by: Aaron Crawfis Co-authored-by: Aaron Crawfis * Update title Signed-off-by: Aaron Crawfis * Add docs to install Radius Bicep extension from VSCode marketplace (#865) * Add docs to install Radius Bicep extension from VSCode marketplace * Revert wrong upd * Revert upd to initialize * Update docs/shared-content/installation/install-radius/initialize-radius.md * Update docs/shared-content/installation/vscode-bicep/install-vscode-bicep.md Co-authored-by: Aaron Crawfis --------- Co-authored-by: Aaron Crawfis * Update get.radapp.dev references (#866) * Switch to radapp.io Signed-off-by: Aaron Crawfis * add link to blog (#875) Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * Remove clarity AAD integration Signed-off-by: Aaron Crawfis * revert config changes * revert config changes --------- Signed-off-by: Aaron Crawfis Signed-off-by: Aaron Crawfis Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> Co-authored-by: Aaron Crawfis Co-authored-by: Jonathan Smith Co-authored-by: Karishma Chawla Co-authored-by: Vishwanath Hiremath <100623239+vishwahiremat@users.noreply.github.com> Co-authored-by: Shalabh Mohan Shrivastava Co-authored-by: Lakshmi Javadekar <103459615+lakshmimsft@users.noreply.github.com> Co-authored-by: Yetkin Timocin Co-authored-by: Ryan Waite Co-authored-by: Ryan Nowak Co-authored-by: Shruthi Kumar Co-authored-by: Will <28876888+willtsai@users.noreply.github.com> * Revert config changes --------- Signed-off-by: Aaron Crawfis Signed-off-by: Aaron Crawfis Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> Co-authored-by: Ryan Nowak Co-authored-by: Jonathan Smith Co-authored-by: Ryan Waite Co-authored-by: rad-ci-bot <103787451+rad-ci-bot@users.noreply.github.com> Co-authored-by: rad-ci-bot Co-authored-by: Aaron Crawfis Co-authored-by: Karishma Chawla Co-authored-by: Vishwanath Hiremath <100623239+vishwahiremat@users.noreply.github.com> Co-authored-by: Shalabh Mohan Shrivastava Co-authored-by: Lakshmi Javadekar <103459615+lakshmimsft@users.noreply.github.com> Co-authored-by: Yetkin Timocin Co-authored-by: Shruthi Kumar Co-authored-by: Will <28876888+willtsai@users.noreply.github.com> --- .github/config/en-custom.txt | 13 +++++ docs/config.toml | 1 - .../concepts/why-radius-concept/index.md | 57 +++++++++++++++++++ .../install-radius/initialize-radius.md | 12 ---- 4 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 docs/content/concepts/why-radius-concept/index.md diff --git a/.github/config/en-custom.txt b/.github/config/en-custom.txt index 7e3eaf36a..1e6906c49 100644 --- a/.github/config/en-custom.txt +++ b/.github/config/en-custom.txt @@ -967,3 +967,16 @@ secureString btdgzez bzmp Webhook +Appi +ness +DevOps +DevSecOps +learnings +architected +customizable +Gitops +OSS +SRE +SREs +OSI +ghcr diff --git a/docs/config.toml b/docs/config.toml index 979fde19e..4ec9b6102 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -67,7 +67,6 @@ tag = "tags" [params] copyright = "Radius" - version = "v0.26" tag_version = "latest" chart_version = "0.26.0" diff --git a/docs/content/concepts/why-radius-concept/index.md b/docs/content/concepts/why-radius-concept/index.md new file mode 100644 index 000000000..aa5a2e25d --- /dev/null +++ b/docs/content/concepts/why-radius-concept/index.md @@ -0,0 +1,57 @@ +--- +type: docs +title: "Concept: Why Radius?" +linkTitle: "Why Radius?" +description: "Describes the motivations for creating Radius." +weight: 300 +categories: "Concept" +--- + +## Our starting point + +We started Radius to simplify and improve upon tools application developers use to deploy and manage applications. Our initial goal was just to create a platform for deployment that developers would love but, as we talked to more cloud customers, we realized almost every enterprise is creating a custom internal developer platform to standardize the way they deploy and manage cloud-native applications + +Most enterprises are not dev-tools experts and as a result they struggle with the cost and complexity of building a home-grown solution. If we could provide an open-source solution that solved these problems for enterprises we could have a big impact. + +A few common problems rose to the top: + +- **Applications are more than just Kubernetes:** standardizing on Kubernetes has been a successful strategy for most enterprises, but applications developers are tasked with managing applications on Kubernetes along with multiple resources in the cloud. Integrating Kubernetes with cloud services has added additional complexity while making compliance with best-practices almost a full-time job. +- **Developers, platform engineers, and IT operators need to collaborate:** to manage the complexity of the cloud, enterprises have specialized disciplines like sec-ops, fin-ops, and cloud centers of excellence. Application developers need to interface with all of these roles, and the tools they use should aid, not impede collaboration. +- **Applications lack an industry-wide definition:** the IT operators, SREs and other specialists that support an application usually lack context about the architecture. Application developers lack context about the underlying cloud infrastructure. As application developers and IT operators collaborate they need a common understanding and visualization of what an application **is**. + +So, we started Radius to address these concerns and provide **our** opinions about how application management should work in today's complex cloud-native landscape. Along the way we came up with the concept of **Appi-ness**: the feeling of satisfaction one has when the application is at the center of every workflow. + +## Applications are more than just Kubernetes + +The modern cloud-native application includes much more than Kubernetes. Applications use databases, message queues, identity systems, SaaS accounts, and observability platforms. However, most of the tools that are available for developers are focused on the Kubernetes basics of compute, storage, and networking. + +Our philosophy is to be inclusive when considering what is *part of the application*. Developers can use cloud resources directly or use Recipes configured by operators for on-demand provisioning of infrastructure. We automate best-practices like IAM/identity assignment, permissions management, diagnostics, and networking configuration based on the application architecture and developer intent. We hope that features like Connections feel like magic when its easy to wire up your dependencies. IT operators control the templates and credentials used to interact with the cloud ensuring that provisioning is done in a supported way. + +## Developers and platform engineers need to collaborate + +Enterprises are creating specialized roles and initiatives to improve their speed, efficiency, and security when adopting the cloud. Platform engineering is an emerging discipline that's combining a product mindset with learnings from DevOps and DevSecOps teams to create internal development platforms. When successful, platform engineers deliver a set of tools that provide sufficient automation, tracking, governance, and observability that guide development teams naturally fall β€œinto the pit of success.” Often these endeavors can come up a little short, looking like a set of repository templates, cloud resource templates, and a software catalog for application developers to use. Unfortunately, the tools and assets that are frequently used don't encourage collaboration between developers and the platform engineers supporting those developers. Platform engineering is new as a discipline, and the patterns that will make enterprises successful long-term are still emerging. + +Radius provides concepts like Environments and Recipes that support a separation of concerns. Platform engineers can create repository templates with CI/CD pipelines and starter code for deployment. IT operators can deploy and govern the Environments where those pipelines deploy applications. Cloud and security experts can provide the Recipes used to create and update cloud resources. Developers are only responsible for describing the requirements and architecture of the application, understanding which environments to use, and choosing dependencies from the supported set of Recipes. + +## Applications need an industry-standard definition + +The myriad of operational roles that support applications in production rarely have the full picture of how the application is architected or a complete picture of the infrastructure resources that are in use. It can be difficult for an organization to understand the impact of an outage or what is causing high consumption and high cost for a cloud resource without a holistic understanding of the application. Unless developers are creating the cloud resources themselves, its hard for them to understand the real infrastructure at work. Teams are adopting software catalogs to help address these problems but there is always drift between the catalog and the source of truth. + +We wanted to do better by building a flexible and customizable picture of what an application *is*. To do this we capture the developer's understanding of the application during deployment and combine that picture with the cloud resources and Recipes used to provision the infrastructure. This data is used to build the Application Graph, a new kind of software catalog that describes the application's architecture, communication patterns, and dependencies as a shared view for the whole organization. + +We hope that this holistic way of thinking about applications becomes the standard and that together with the rest of the cloud-native ecosystem we can build a set of tools that promote **Appi-ness**. + +## What we're not rethinking + +Many practices and technologies in cloud-native development are a success and don't need to be re-thought. + +- Radius makes is easy for application developers to adopt because it supports your existing containerized code, Dockerfiles, and Helm charts. +- We believe that [twelve-factor](https://12factor.net/) is still a great set of ideas and so any twelve-factor style application should be easy to use with Radius. +- We like infrastructure-as-code as for its repeatability and use it for both Recipes and application descriptions. +- There are plenty of great CI/CD systems, application delivery pipelines, and Gitops systems out there and Radius can work with any of them. + +## Open-source from the start + +We planned for Radius to be open-source from the start because we want to reach as many developers, organizations, and ecosystem partners as we can. Open-source can mean different things to different people. For Radius, open-source means that our source code is publicly available under an OSI-approved permissive license. It also means that the Radius project uses an neutral and open governance model to continue the evolution of Radius as a multi-cloud technology going forward. Anyone should be able to contribute to Radius, extend the platform, self-host Radius for internal use, or use it to build a business hosting other people's applications. + +We know from our conversations with enterprises that customization, extensibility, and a large ecosystem are key. Every organization is unique and will make different policy, workflow, and technology choices. Every large organization has critical internal technologies. Extensibility is the way to put those internal technologies on even-footing with the cloud. A large ecosystem of partners and integrations enables everyone to keep using the technologies they are already committed to. By participating in open-source, users have a direct channel to propose changes, give feedback, add features, or customize the version of Radius they use. Our commitment to open-source and neutral, open governance means any technology vendor can join the ecosystem and benefit from the level playing-field that's being created. diff --git a/docs/shared-content/installation/install-radius/initialize-radius.md b/docs/shared-content/installation/install-radius/initialize-radius.md index afba890e4..da2c78385 100644 --- a/docs/shared-content/installation/install-radius/initialize-radius.md +++ b/docs/shared-content/installation/install-radius/initialize-radius.md @@ -1,17 +1,5 @@ Initializing Radius installs the Radius control-plane and creates a Radius Environment. The control-plane is a set of services that provide the core functionality of Radius, running in the `radius-system` namespace. -1. Create a Kubernetes cluster - - Radius runs inside [Kubernetes]({{< ref "guides/operations/kubernetes" >}}). Create one from the [supported k8s clusters]({{< ref "/guides/operations/kubernetes/overview#supported-kubernetes-clusters" >}}) - - > _If you don't have a preferred way to create Kubernetes clusters, you could try using [k3d](https://k3d.io/), which runs a minimal Kubernetes distribution in Docker._ - - Ensure your cluster is set as your current context: - - ```bash - kubectl config current-context - ``` - 1. Create a Kubernetes cluster Radius runs inside [Kubernetes]({{< ref "guides/operations/kubernetes" >}}). Create one from the [supported k8s clusters]({{< ref "/guides/operations/kubernetes/overview#supported-kubernetes-clusters" >}}) From 8c09b4a166003a5fa3c4a5e175d929bb6abf30c0 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Wed, 18 Oct 2023 14:20:15 -0700 Subject: [PATCH 28/52] Add auto-generated reference docs shortcode (#880) * Create script to create reference pages * Switch to shortcode for Bicep * Update script * Update docs * Add shortcode Signed-off-by: Aaron Crawfis * Remove generated docs Signed-off-by: Aaron Crawfis --------- Signed-off-by: Aaron Crawfis --- docs/layouts/shortcodes/schemaExample.html | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/layouts/shortcodes/schemaExample.html diff --git a/docs/layouts/shortcodes/schemaExample.html b/docs/layouts/shortcodes/schemaExample.html new file mode 100644 index 000000000..1a540eee4 --- /dev/null +++ b/docs/layouts/shortcodes/schemaExample.html @@ -0,0 +1,7 @@ +{{ $bicepExample := "example.bicep" }} +{{ $bicepExamplePath := path.Join .Page.File.Dir $bicepExample }} + +{{ if fileExists $bicepExamplePath }} +{{ $bicepContent := $bicepExamplePath | readFile }} +{{ highlight $bicepContent "bicep" }} +{{ end }} \ No newline at end of file From 61da7b7757d165fe1fce1936ca0817046e12f92a Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:54:00 -0400 Subject: [PATCH 29/52] Order concept docs (#879) --- docs/content/concepts/multi-cloud-concept/index.md | 2 +- docs/content/concepts/why-radius-concept/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/concepts/multi-cloud-concept/index.md b/docs/content/concepts/multi-cloud-concept/index.md index 038d3a5af..132ddd665 100644 --- a/docs/content/concepts/multi-cloud-concept/index.md +++ b/docs/content/concepts/multi-cloud-concept/index.md @@ -3,7 +3,7 @@ type: docs title: "Concept: Open-source and multi-cloud" linkTitle: Open-source and multi-cloud description: For many enterprises, their cloud native computing strategy involves using multiple cloud providers. Open source projects, like Kubernetes, help ensure these enterprises achieve their strategy. As a result, Radius was designed to be open-source and multi-cloud from the start. -weight: 100 +weight: 200 categories: "Concept" --- diff --git a/docs/content/concepts/why-radius-concept/index.md b/docs/content/concepts/why-radius-concept/index.md index aa5a2e25d..68add0a2c 100644 --- a/docs/content/concepts/why-radius-concept/index.md +++ b/docs/content/concepts/why-radius-concept/index.md @@ -3,7 +3,7 @@ type: docs title: "Concept: Why Radius?" linkTitle: "Why Radius?" description: "Describes the motivations for creating Radius." -weight: 300 +weight: 100 categories: "Concept" --- From 15e10a7ba5e6af85bd44e1658d90350ecdf5f196 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 06:29:44 -0700 Subject: [PATCH 30/52] Fix image name Signed-off-by: Aaron Crawfis --- docs/content/tutorials/new-app/snippets/1-app.bicep | 2 +- docs/content/tutorials/new-app/snippets/2-app-mongo.bicep | 2 +- docs/content/tutorials/new-app/snippets/3-app-backend.bicep | 2 +- docs/content/tutorials/new-app/snippets/4-app-gateway.bicep | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/tutorials/new-app/snippets/1-app.bicep b/docs/content/tutorials/new-app/snippets/1-app.bicep index 83a7af2b4..1c9818558 100644 --- a/docs/content/tutorials/new-app/snippets/1-app.bicep +++ b/docs/content/tutorials/new-app/snippets/1-app.bicep @@ -9,7 +9,7 @@ resource demo 'Applications.Core/containers@2023-10-01-preview' = { properties: { application: application container: { - image: 'radius.azurecr.io/tutorial/webapp:edge' + image: 'radius.azurecr.io/samples/demo:latest' ports: { web: { containerPort: 3000 diff --git a/docs/content/tutorials/new-app/snippets/2-app-mongo.bicep b/docs/content/tutorials/new-app/snippets/2-app-mongo.bicep index 39076d5db..a31aba8ec 100644 --- a/docs/content/tutorials/new-app/snippets/2-app-mongo.bicep +++ b/docs/content/tutorials/new-app/snippets/2-app-mongo.bicep @@ -10,7 +10,7 @@ resource demo 'Applications.Core/containers@2023-10-01-preview' = { properties: { application: application container: { - image: 'radius.azurecr.io/tutorial/demo:edge' + image: 'radius.azurecr.io/samples/demo:latest' env: { FOO: 'bar' } diff --git a/docs/content/tutorials/new-app/snippets/3-app-backend.bicep b/docs/content/tutorials/new-app/snippets/3-app-backend.bicep index 4cc06a412..86f3b693c 100644 --- a/docs/content/tutorials/new-app/snippets/3-app-backend.bicep +++ b/docs/content/tutorials/new-app/snippets/3-app-backend.bicep @@ -13,7 +13,7 @@ resource frontend 'Applications.Core/containers@2023-10-01-preview' = { properties: { application: application container: { - image: 'radius.azurecr.io/tutorial/demo:edge' + image: 'radius.azurecr.io/samples/demo:latest' env: { FOO: 'bar' } diff --git a/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep b/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep index c6b2ff067..c23db82e0 100644 --- a/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep +++ b/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep @@ -13,7 +13,7 @@ resource frontend 'Applications.Core/containers@2023-10-01-preview' = { properties: { application: application container: { - image: 'radius.azurecr.io/tutorial/demo:edge' + image: 'radius.azurecr.io/samples/demo:latest' env: { FOO: 'bar' } From f8aa4dddcc376b1944a91619517eeb7e2db9fc20 Mon Sep 17 00:00:00 2001 From: Reshma Abdul Rahim <61033581+Reshrahim@users.noreply.github.com> Date: Thu, 19 Oct 2023 10:43:46 -0400 Subject: [PATCH 31/52] trailing slash config (#887) --- docs/content/staticwebapp.config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 5c128bb98..063567a25 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,4 +1,5 @@ { + "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From 8973114985adddf3e082025d022dcf634983f29a Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 07:53:00 -0700 Subject: [PATCH 32/52] Switch to auto Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 063567a25..ddc63b90d 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,5 @@ { - "trailingSlash": "always", + "trailingSlash": "auto", "routes": [ { "route": "/.auth/login/aad", From 090cef97ad099ff7308c4ed2b6f89920c1d7ee05 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 07:59:37 -0700 Subject: [PATCH 33/52] Revert trailingSlash Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index ddc63b90d..5c128bb98 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,4 @@ { - "trailingSlash": "auto", "routes": [ { "route": "/.auth/login/aad", From b132573664e45d2a7659459f6467bd0cff8d147f Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:06:32 -0700 Subject: [PATCH 34/52] Switch back to always Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 5c128bb98..063567a25 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,4 +1,5 @@ { + "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From 2e2a4e0c2349af24cddcd73539e1f24882121321 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:17:00 -0700 Subject: [PATCH 35/52] Switch to never Signed-off-by: Aaron Crawfis --- .github/workflows/website.yaml | 17 ----------------- docs/content/staticwebapp.config.json | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 830cab0e5..67ff5f269 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -128,23 +128,6 @@ jobs: api_location: "site/" output_location: "" skip_app_build: true - - name: Find SWA Comment - uses: peter-evans/find-comment@v2 - id: fc - if: github.event_name == 'pull_request' - with: - issue-number: ${{ github.event.pull_request.number }} - comment-author: 'github-actions[bot]' - body-includes: 'Azure Static Web Apps:' - direction: last - - name: Update SWA Comment - if: github.event_name == 'pull_request' && steps.fc.outputs.comment-id != '' - uses: peter-evans/create-or-update-comment@v3 - with: - comment-id: ${{ steps.fc.outputs.comment-id }} - body: | - - **Password**: `Radiu$1234` close_pr_site: name: Close PR Staging Site diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 063567a25..0255c2e2e 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,5 @@ { - "trailingSlash": "always", + "trailingSlash": "never", "routes": [ { "route": "/.auth/login/aad", From e18630cd3a5bea8f53aec734bddbca0cc38d0ea8 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:24:27 -0700 Subject: [PATCH 36/52] Set to always Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 0255c2e2e..063567a25 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,5 @@ { - "trailingSlash": "never", + "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From b6a5fd620b9e3219219c7052502ca2f193e7748a Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:30:46 -0700 Subject: [PATCH 37/52] Omit trailing slashes Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 063567a25..5c128bb98 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,4 @@ { - "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From a00152b8005dc398458dbcfc177b27cfbcfc1279 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:38:50 -0700 Subject: [PATCH 38/52] Use trailingSlash always Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 5c128bb98..063567a25 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,4 +1,5 @@ { + "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From 631c0830a651823af4a0211ec97a9f4be2c7b31e Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:43:15 -0700 Subject: [PATCH 39/52] Remove trailingSlashes Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 063567a25..5c128bb98 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,4 @@ { - "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From 4eca9ff37df135d46d7d35df7847bad44e532535 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:49:48 -0700 Subject: [PATCH 40/52] Fix trailing slash Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 5c128bb98..063567a25 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,4 +1,5 @@ { + "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From 3f029c8856bd18f3f2f7a05da5b771506b2aad50 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 08:51:24 -0700 Subject: [PATCH 41/52] Revert update Signed-off-by: Aaron Crawfis --- docs/content/staticwebapp.config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/content/staticwebapp.config.json b/docs/content/staticwebapp.config.json index 063567a25..5c128bb98 100644 --- a/docs/content/staticwebapp.config.json +++ b/docs/content/staticwebapp.config.json @@ -1,5 +1,4 @@ { - "trailingSlash": "always", "routes": [ { "route": "/.auth/login/aad", From de586265c8b742a87ec5c3a88cb28f525e8d2a46 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 11:07:31 -0700 Subject: [PATCH 42/52] Fix frontend name for new-app tutorial (#890) * Fix frontend name Signed-off-by: Aaron Crawfis * Fix frontend name Co-authored-by: Saverio Proto Signed-off-by: Aaron Crawfis --------- Signed-off-by: Aaron Crawfis Co-authored-by: Saverio Proto --- docs/content/tutorials/new-app/index.md | 30 +++++++++---------- .../new-app/snippets/3-app-backend.bicep | 4 +-- .../new-app/snippets/4-app-gateway.bicep | 6 ++-- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/content/tutorials/new-app/index.md b/docs/content/tutorials/new-app/index.md index 3b32e858f..975c95067 100644 --- a/docs/content/tutorials/new-app/index.md +++ b/docs/content/tutorials/new-app/index.md @@ -252,13 +252,13 @@ In addition to containers, you can add dependencies like Redis caches, Dapr Stat Resources: myapp Applications.Core/applications - frontend Applications.Core/containers + demo Applications.Core/containers mongodb Applications.Datastores/mongoDatabases Starting log stream... ``` -1. Open [localhost:3000](http://localhost:3000) to interact with the frontend container. You should see the container's connections and metadata, this time with a connection to the Mongo database and new environment variables set: +1. Open [localhost:3000](http://localhost:3000) to interact with the demo container. You should see the container's connections and metadata, this time with a connection to the Mongo database and new environment variables set: Screenshot of the Radius demo container @@ -275,20 +275,20 @@ In addition to containers, you can add dependencies like Redis caches, Dapr Stat ``` Displaying application: myapp - Name: frontend (Applications.Core/containers) + Name: demo (Applications.Core/containers) Connections: - frontend -> mongodb (Applications.Datastores/mongoDatabases) + demo -> mongodb (Applications.Datastores/mongoDatabases) Resources: - frontend (kubernetes: apps/Deployment) - frontend (kubernetes: core/Secret) - frontend (kubernetes: core/Service) - frontend (kubernetes: core/ServiceAccount) - frontend (kubernetes: rbac.authorization.k8s.io/Role) - frontend (kubernetes: rbac.authorization.k8s.io/RoleBinding) + demo (kubernetes: apps/Deployment) + demo (kubernetes: core/Secret) + demo (kubernetes: core/Service) + demo (kubernetes: core/ServiceAccount) + demo (kubernetes: rbac.authorization.k8s.io/Role) + demo (kubernetes: rbac.authorization.k8s.io/RoleBinding) Name: mongodb (Applications.Datastores/mongoDatabases) Connections: - frontend (Applications.Core/containers) -> mongodb + demo (Applications.Core/containers) -> mongodb Resources: mongo-bzmp2btdgzez6 (kubernetes: apps/Deployment) mongo-bzmp2btdgzez6 (kubernetes: core/Service) @@ -302,7 +302,7 @@ In addition to dependencies, you can add more containers to make your applicatio {{% rad file="snippets/3-app-backend.bicep" embed=true marker="//BACKEND" %}} -1. Add a new connection from your `frontend` container to the `backend` container: +1. Add a new connection from your `demo` container to the `backend` container: {{% rad file="snippets/3-app-backend.bicep" embed=true marker="//CONTAINER" markdownConfig="{hl_lines=[\"20-22\"]}" %}} @@ -322,14 +322,14 @@ In addition to dependencies, you can add more containers to make your applicatio Deployment Complete Resources: - frontend Applications.Core/containers + demo Applications.Core/containers backend Applications.Core/containers mongodb Applications.Datastores/mongoDatabases Starting log stream... ``` -1. Open [localhost:3000](http://localhost:3000) to interact with the frontend container. You should see the container's connections and metadata, this time with a connection to the backend container and new environment variables set: +1. Open [localhost:3000](http://localhost:3000) to interact with the demo container. You should see the container's connections and metadata, this time with a connection to the backend container and new environment variables set: Screenshot of the demo container with a connection to the backend container @@ -359,7 +359,7 @@ Finally, you can add a gateway to your application. Gateways are used to expose Deployment Complete Resources: - frontend Applications.Core/containers + demo Applications.Core/containers backend Applications.Core/containers gateway Applications.Core/gateways mongodb Applications.Datastores/mongoDatabases diff --git a/docs/content/tutorials/new-app/snippets/3-app-backend.bicep b/docs/content/tutorials/new-app/snippets/3-app-backend.bicep index 86f3b693c..4935479ce 100644 --- a/docs/content/tutorials/new-app/snippets/3-app-backend.bicep +++ b/docs/content/tutorials/new-app/snippets/3-app-backend.bicep @@ -8,8 +8,8 @@ param application string param environment string //CONTAINER -resource frontend 'Applications.Core/containers@2023-10-01-preview' = { - name: 'frontend' +resource demo 'Applications.Core/containers@2023-10-01-preview' = { + name: 'demo' properties: { application: application container: { diff --git a/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep b/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep index c23db82e0..ad67bcd70 100644 --- a/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep +++ b/docs/content/tutorials/new-app/snippets/4-app-gateway.bicep @@ -8,8 +8,8 @@ param application string param environment string //CONTAINER -resource frontend 'Applications.Core/containers@2023-10-01-preview' = { - name: 'frontend' +resource demo 'Applications.Core/containers@2023-10-01-preview' = { + name: 'demo' properties: { application: application container: { @@ -70,7 +70,7 @@ resource gateway 'Applications.Core/gateways@2023-10-01-preview' = { routes: [ { path: '/' - destination: 'http://frontend:3000' + destination: 'http://demo:3000' } ] } From 90239b19b5194cd1d24ac5d23c51678a5f829013 Mon Sep 17 00:00:00 2001 From: castlec Date: Thu, 19 Oct 2023 14:13:01 -0400 Subject: [PATCH 43/52] corrected typo, sharing => sharding (#891) --- docs/content/concepts/architecture-concept/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/concepts/architecture-concept/index.md b/docs/content/concepts/architecture-concept/index.md index 8ca6be452..8212a346a 100644 --- a/docs/content/concepts/architecture-concept/index.md +++ b/docs/content/concepts/architecture-concept/index.md @@ -43,7 +43,7 @@ The service that performs this central functionality in Radius is called the Uni UCP contains functionality for federating with separate resource managers as well as its resource providers. For example UCP can route requests to Azure or AWS to manage resources on those cloud systems. -UCP is a scalable REST API that can function either with a single global shard or using regional sharing. UCP is based on the design principles of the Azure Resource Manager (ARM) control-plane but generalizes to work across multiple clouds and systems. The UCP codebase is fully open-source and was created from scratch as part of the Radius project. UCP is written in Go. +UCP is a scalable REST API that can function either with a single global shard or using regional sharding. UCP is based on the design principles of the Azure Resource Manager (ARM) control-plane but generalizes to work across multiple clouds and systems. The UCP codebase is fully open-source and was created from scratch as part of the Radius project. UCP is written in Go. UCP provides routing and federation with internal and external services: From e98d0b10293dff25b847c609d5213185eef290f0 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 11:22:59 -0700 Subject: [PATCH 44/52] Spelling Signed-off-by: Aaron Crawfis --- .github/config/en-custom.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/config/en-custom.txt b/.github/config/en-custom.txt index 1e6906c49..5cffe54d3 100644 --- a/.github/config/en-custom.txt +++ b/.github/config/en-custom.txt @@ -980,3 +980,4 @@ SRE SREs OSI ghcr +sharding From 56fa7634f714feda0bfb684e8083554b7aeec467 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Thu, 19 Oct 2023 13:38:09 -0700 Subject: [PATCH 45/52] Add redirect for radapp.dev (#895) Signed-off-by: Aaron Crawfis --- .github/workflows/redirect.yml | 48 ++++++++++++++++++++++++++++++++++ redirect/README.md | 3 +++ redirect/src/index.html | 10 +++++++ 3 files changed, 61 insertions(+) create mode 100644 .github/workflows/redirect.yml create mode 100644 redirect/README.md create mode 100644 redirect/src/index.html diff --git a/.github/workflows/redirect.yml b/.github/workflows/redirect.yml new file mode 100644 index 000000000..0390de50b --- /dev/null +++ b/.github/workflows/redirect.yml @@ -0,0 +1,48 @@ +name: Radius Redirect + +on: + workflow_dispatch: + push: + branches: + - edge + - v*.* + paths: + - 'redirect/**' + - '.github/workflows/redirect.yml' + pull_request: + branches: + - edge + - v*.* + paths: + - 'redirect/**' + - '.github/workflows/redirect.yml' + +jobs: + deploy-website: + name: Deploy Redirect Website + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + submodules: false + - name: Deploy staging site + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.SWA_REDIRECT_TOKEN }} + action: "upload" + app_location: "redirect/src" + skip_api_build: true + skip_app_build: true + + close_pr_site: + name: Close PR Staging Site + if: github.event_name == 'pull_request' && github.event.action == 'closed' + runs-on: ubuntu-latest + steps: + - name: Close Pull Request + id: closepullrequest + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.SWA_REDIRECT_TOKEN }} + action: "close" diff --git a/redirect/README.md b/redirect/README.md new file mode 100644 index 000000000..0f2d8e625 --- /dev/null +++ b/redirect/README.md @@ -0,0 +1,3 @@ +# Redirect Page + +Our current domain, `radapp.io`, is the homepage for Radius. We previously operated on `radapp.dev` and may still have some remaining links to that domain. This directory contains a redirect page that we host on `radapp.dev` to redirect to `radapp.io`. diff --git a/redirect/src/index.html b/redirect/src/index.html new file mode 100644 index 000000000..2e9a35686 --- /dev/null +++ b/redirect/src/index.html @@ -0,0 +1,10 @@ + + + + Redirecting to https://radapp.io + + + +

Please wait while you are redirected to https://radapp.io

+ + From 47cb26c433ed4ee14e5d182b0c765eff49237e0f Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 23 Oct 2023 08:44:02 -0700 Subject: [PATCH 46/52] Add skip secret (#892) Signed-off-by: Aaron Crawfis --- .github/workflows/website.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 67ff5f269..0dd9ed9b1 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -38,7 +38,6 @@ jobs: repository: radius-project/radius ref: ${{ env.RELEASE_BRANCH }} path: ./radius - token: ${{ secrets.GH_RAD_CI_BOT_PAT }} - name: Setup Node uses: actions/setup-node@v2 with: @@ -122,6 +121,7 @@ jobs: uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.ENV_STATICWEBAPP_TOKEN }} + skip_deploy_on_missing_secrets: true repo_token: ${{ secrets.GITHUB_TOKEN }} action: "upload" app_location: "site/" @@ -129,6 +129,7 @@ jobs: output_location: "" skip_app_build: true + close_pr_site: name: Close PR Staging Site if: github.event_name == 'pull_request' && github.event.action == 'closed' From aff4caebe13c568c8ffde8a31876bccb361270d1 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 23 Oct 2023 08:45:51 -0700 Subject: [PATCH 47/52] Remove old recordings --- docs/content/community/overview.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/docs/content/community/overview.md b/docs/content/community/overview.md index 4bf144fb6..e433e4aa7 100644 --- a/docs/content/community/overview.md +++ b/docs/content/community/overview.md @@ -31,15 +31,6 @@ To present a specific topic on the next Radius community call start by filling o | Date | Topic(s) | Meeting Link | Recording | |------|----------|--------------|-----------| -| Thursday Feb 16th 9:00am Pacific Time (PST) | v0.17 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-02-16%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=u11ceV) | -| Thursday Mar 16th 9:00am Pacific Time (PST) | v0.18 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-03-16%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=LMW6HE) | -| Thursday Apr 20th 9:00am Pacific Time (PST) | v0.19 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-04-20%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=RCA5Qx) | -| Thursday May 18th 9:00am Pacific Time (PST) | v0.20 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-05-18%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=fKcbzm) | -| Thursday June 15th 9:00am Pacific Time (PST) | v0.21 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-06-15%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=WIRhP5) | -| Thursday July 13th 9:00am Pacific Time (PST) | v0.22 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-07-13%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=v30w8D) | -| Thursday Aug 8th 9:00am Pacific Time (PST) | v0.23 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-08-08%20Project%20Radius%20Community%20Call.mp4?csf=1&web=1&e=6Lew1D&nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJTdHJlYW1XZWJBcHAiLCJyZWZlcnJhbFZpZXciOiJTaGFyZURpYWxvZyIsInJlZmVycmFsQXBwUGxhdGZvcm0iOiJXZWIiLCJyZWZlcnJhbE1vZGUiOiJ2aWV3In19) | -| Thursday Aug 31st 9:00am Pacific Time (PST) | v0.24 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-08-31%20Radius%20Community%20Call.mp4?csf=1&web=1&e=YBjiMv&nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJTdHJlYW1XZWJBcHAiLCJyZWZlcnJhbFZpZXciOiJTaGFyZURpYWxvZyIsInJlZmVycmFsQXBwUGxhdGZvcm0iOiJXZWIiLCJyZWZlcnJhbE1vZGUiOiJ2aWV3In19) | -| Tuesday, Oct 2nd 9:00am Pacific Time (PST) | v0.25 release | - | [Stream](https://microsoft.sharepoint.com/:v:/r/teams/radius/Shared%20Documents/General/Community%20Calls/2023-10-03%20Radius%20Community%20Call.mp4?csf=1&web=1&e=9iXqbg) ## GitHub Issues & repositories From cc29e4f2b12df1517d0dd39ea54cb12d193bb426 Mon Sep 17 00:00:00 2001 From: Will <28876888+willtsai@users.noreply.github.com> Date: Mon, 23 Oct 2023 09:17:39 -0700 Subject: [PATCH 48/52] udpate community page to link out to community repo for meeting info (#902) Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> --- docs/content/community/overview.md | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/docs/content/community/overview.md b/docs/content/community/overview.md index e433e4aa7..85b143b7d 100644 --- a/docs/content/community/overview.md +++ b/docs/content/community/overview.md @@ -12,25 +12,11 @@ Welcome to the Radius community! The best way to interact with the community is via the Radius Discord server: -{{< button link="https://discord.gg/SRG3ePMKNy" text="Radius Discord" newtab="true" >}} +{{< button link="https://aka.ms/radius/discord" text="Radius Discord" newtab="true" >}} ## Community meetings -Every month we host a community meeting to showcase new features, review upcoming milestones, and engage in a Q&A. -Anyone from the Radius community can participate, present a topic, or host. All are welcome! - -### Meeting link - -The meeting link and details are sent out via email. - -### Present your topic - -To present a specific topic on the next Radius community call start by filling out this short form, [Radius community call presenter sign-up form](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbRw_b7M-8iE1NkIMvs0xAJFFUQlozVThYSzI4OVhRU0E3NlI0U05GNzZFTi4u). - -### Calendar - -| Date | Topic(s) | Meeting Link | Recording | -|------|----------|--------------|-----------| +Every month we host a community meeting to showcase new features, review upcoming milestones, and engage in a Q&A. Anyone from the Radius community can participate, present a topic, or host. All are welcome! For the meeting schedule, links, and more information, visit the Radius [community repo](https://github.com/radius-project/community#community-meetings). ## GitHub Issues & repositories From 83a23ee42bacc6054d94be88e5bb3ec278934896 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 23 Oct 2023 14:15:42 -0700 Subject: [PATCH 49/52] Reorder weights Signed-off-by: Aaron Crawfis --- docs/content/community/_index.md | 2 +- docs/content/reference/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/community/_index.md b/docs/content/community/_index.md index f0fd89bda..96daf0a19 100644 --- a/docs/content/community/_index.md +++ b/docs/content/community/_index.md @@ -3,5 +3,5 @@ type: docs title: "Radius Community" linkTitle: "Community" description: "Information about the Radius community" -weight: 80 +weight: 90 --- diff --git a/docs/content/reference/_index.md b/docs/content/reference/_index.md index 796a51a47..30d41b833 100644 --- a/docs/content/reference/_index.md +++ b/docs/content/reference/_index.md @@ -3,5 +3,5 @@ type: docs title: "Radius reference documentation" linkTitle: "Reference" description: "Detailed reference documentation on various Radius components" -weight: 90 +weight: 100 --- From 53e61d5719eadc563ce65bcdef1c0751fe3ee062 Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 23 Oct 2023 15:14:11 -0700 Subject: [PATCH 50/52] Remove az login from validate Bicep --- .github/workflows/validate-bicep.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/validate-bicep.yaml b/.github/workflows/validate-bicep.yaml index 5c1c4679d..4eea5b869 100644 --- a/.github/workflows/validate-bicep.yaml +++ b/.github/workflows/validate-bicep.yaml @@ -27,12 +27,6 @@ jobs: steps: - name: Check out repo uses: actions/checkout@v2 - - name: az CLI login - run: | - az login --service-principal \ - --username ${{ secrets.AZURE_SP_TESTS_APPID }} \ - --password ${{ secrets.AZURE_SP_TESTS_PASSWORD }} \ - --tenant ${{ secrets.AZURE_SP_TESTS_TENANTID }} - name: Parse release version and set environment variables run: python ./.github/scripts/get_docs_version.py - name: Download rad-bicep From 29bfb3f98d52d3b0104d34a3b6c86ee3c9b5383c Mon Sep 17 00:00:00 2001 From: Matt Mazzola Date: Mon, 23 Oct 2023 15:18:06 -0700 Subject: [PATCH 51/52] Fix link to concepts on docs home page (#905) Co-authored-by: Aaron Crawfis --- docs/content/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/_index.md b/docs/content/_index.md index 38558bd1a..7f46740d7 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -27,7 +27,7 @@ Radius is a cloud native application platform. It enables developers and IT ope {{< /card >}} {{< /cardpane >}} {{< cardpane >}} - {{< card header="**πŸ’­ Concepts**" footer="[**Learn the concepts β†’**]({{< ref tutorials >}})" >}} + {{< card header="**πŸ’­ Concepts**" footer="[**Learn the concepts β†’**]({{< ref concepts >}})" >}} Learn about the background and concepts behind Radius with in-depth explanations. We'll cover the main concepts and how Radius works, so you have the broader context to deeply understand Radius and use it most effectively. {{< /card >}} {{< card header="**🧾 Reference**" footer="[**Visit reference material β†’**]({{< ref guides >}})" >}} From 12181fbcc6f4204275240b8e1caf5d5d2edb847d Mon Sep 17 00:00:00 2001 From: Aaron Crawfis Date: Mon, 23 Oct 2023 15:20:37 -0700 Subject: [PATCH 52/52] Fix credential --- .github/workflows/website.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 0dd9ed9b1..3080fa00b 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -143,6 +143,7 @@ jobs: uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.ENV_STATICWEBAPP_TOKEN }} + skip_deploy_on_missing_secrets: true action: "close" algolia_index: