Skip to content

Feature spec: compute extensibility user experience #96

New issue

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

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

Already on GitHub? Sign in to your account

Open
wants to merge 29 commits into
base: main
Choose a base branch
from

Conversation

willtsai
Copy link
Contributor

@willtsai willtsai commented Jun 4, 2025

Add feature spec for compute extensibility to define requirements and user experience

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
@willtsai willtsai requested review from a team as code owners June 4, 2025 05:27
willtsai added 3 commits June 3, 2025 22:28
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
@willtsai willtsai marked this pull request as draft June 6, 2025 18:17
willtsai added 2 commits June 6, 2025 17:01
… 2.5 Pro assisted in VSCode)

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
@willtsai willtsai marked this pull request as ready for review June 10, 2025 18:09
- **Bicep/Terraform Capabilities and Limitations**: The feasibility of implementing all necessary provisioning logic (currently in Go for Kubernetes) within Bicep or Terraform recipes.
- Risk: Some complex logic might be difficult or impossible to replicate.
- Mitigation: Early Proof of Concept (POC) for Kubernetes provisioning in Bicep/Terraform. Implement ACI provisioning first as a less complex target to identify limitations. Consider Terraform if Bicep has significant gaps for certain platforms.
- **Radius Application Graph Integrity**: Ensuring that recipes can correctly define and maintain relationships and connections between resources (e.g., `containers.connections`) as the current system does.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've talked about this a lot and I cover this in my design, if we don't move forward with my design we can still move forward with the nested types concept and using connections which would expressly create those relationships for the app graph on behalf of the recipe authors.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additionally I'll be authoring a design on a new test framework for type/recipe combinations that check whether the contract is satisfied by recipe execution.


### Non-goals (out of scope)
<!-- What are we explicitly not trying to accomplish? -->
- Running the Radius control plane on a non-Kubernetes platform.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is out of scope for now or forever?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For now, it's do-able.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

out of scope for now, added a link to the roadmap item here.

<!-- What big questions must we answer in order to clarify our plan for this scenario. When and how do you plan to answer those questions (prototype feature x, user research, competitive research, etc.) -->
- **Assumption**: All essential provisioning logic currently in Radius's Go code for Kubernetes (for containers, gateways, secret stores) can be effectively replicated using Bicep or Terraform recipes.
- Validation: POC implementation of Kubernetes recipes for core functionalities.
- **Assumption**: Recipes can reliably output the necessary information for Radius to construct and maintain the application graph, including resource connections.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works the other way around, AppCoreRP constructs the graph including connections and then provides recipe inputs, so I don't think there will be any risk.

- Validation: Test recipe deployments and inspect the resulting Radius graph.
- **Question**: What is the most effective way for recipes to declare their input parameters and output properties to ensure consistency and enable validation?
- Exploration: Define a clear contract for recipes, potentially using a schema or metadata definition that can be validated.
- **Question**: How can platform engineers easily test and debug their custom recipes before registering them in a live environment?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will address this in the type/recipe testing framework design

… -->
#### Setting up and deploying an application to a Radius environment using existing Recipes for core types:

1. **Discover existing Recipes**:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do people browse OCI registries? I believe we're missing an opportunity here because usually they find things in some other way (depending on the package framework) then the OCI registry is the source for install. Dockerhub is an example where it does both, but the search/browse framework is not part of the registry inherently. You can't go to ghcr.io in your browser for instance.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can leverage something like an Artifact Hub -https://artifacthub.io/ to discover Recipes

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, good points, but let's keep Recipe discoverability separate from this feature spec.

}
}
// This container requests confidential compute
extensions: [

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we support extensions on UDTs? Wouldn't these be additional optional properties consumed as recipe inputs instead?

1. **Configure Environment-Specific Recipe Parameters (Optional)**:
* If recipes have parameters that need to be set globally for an environment, configure them using `rad recipe update` or during registration.

#### Packaging and Registering a "Recipe Pack" for an Environment:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a fantastic implementation, I like that version is already included.

<!-- One or two sentence summary -->
Implement a system for packaging and versioning sets of related recipes (Recipe Packs) to simplify distribution and management. This includes defining a clear structure for Recipe Packs and providing CLI commands for creating, updating, and applying them. Default Recipes for Kubernetes and ACI will be provided by Radius as part of the initial Recipe Packs.

### Feature 5: CLI Enhancements for Recipe Management (as necessary)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to at least see a CLI change that takes the recipe pack manifest as input and will register all of them in one command. It would be great to see this for types as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, a rad environment update my-env --recipe-pack ./recipe-pack.yaml command is proposed in the detailed user scenarios section.

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

### Non-goals (out of scope)
<!-- What are we explicitly not trying to accomplish? -->
- Running the Radius control plane on a non-Kubernetes platform.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this mean that with extensibility and core types as UDTs we shouldn't expect to be able to host UCP in a different platform?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct


### Positive user outcome
<!-- What is the positive outcome for the user if we deliver this, i.e. what is the value proposition for the user? Remember, this is user-centric. -->
As a platform engineer, I can confidently adopt Radius across my organization, knowing I can extend its capabilities to support any compute platform, secret store, or gateway my teams require, without waiting for built-in support or modifying Radius core. I can register, customize, and share recipes that define how Radius provisions these resources, ensuring consistency with our application definitions while maintaining flexibility in our infrastructure choices and adhering to organizational standards. This empowers my development teams to leverage Radius benefits regardless of the underlying infrastructure.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are talking about containers, secret stores, and gateways a lot. Are these the main resource types that we are focusing on? Why are we not talking about other core resource types?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, we should include volumes, Will T said extenders are out of scope which I agree as I believe they'd just be replaced by new types/recipes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, added the inclustion of volume resources too now.

A platform engineer customizes the default Kubernetes recipes for `Applications.Core/containers@2025-05-01-preview` (and similarly for `gateways` and `secretStores`) to align with company-specific infrastructure policies, such as adding mandatory security sidecars, custom labels for cost tracking, or integrating with internal monitoring systems, by modifying the recipe and re-registering it.

### Scenario 3: Extend Radius to a new, unsupported platform
A platform engineer creates new Bicep or Terraform recipes to enable Radius to deploy `Applications.Core/containers@2025-05-01-preview` to AWS Fargate, `Applications.Core/gateways@2025-05-01-preview` to an AWS Application Load Balancer, and `Applications.Core/secretStores@2025-05-01-preview` to AWS Secrets Manager. They then register these recipes in their Radius environment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we could also build a library of core types, custom resource types, and extensibility types that the users would be able to use, that would be amazing for the community.

If someone builds the extensibility recipe to deploy to AWS Fargate and if I can see that and use that, I wouldn't need to write it from scratch.

I guess that would be huge for Radius.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to extend the recipe without creating full recipe but overriding certain parameters?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to extend the recipe without creating full recipe but overriding certain parameters?

no, but I've created a feature request to track this separately.
radius-project/radius#9820

- Mitigation: Early Proof of Concept (POC) for Kubernetes provisioning in Bicep/Terraform. Implement ACI provisioning first as a less complex target to identify limitations. Consider Terraform if Bicep has significant gaps for certain platforms.
- **Radius Application Graph Integrity**: Ensuring that recipes can correctly define and maintain relationships and connections between resources (e.g., `containers.connections`) as the current system does.
- Risk: Recipes might not fully capture or might incorrectly represent resource relationships, leading to broken application deployments or incorrect graph data.
- Mitigation: Design and provide reusable Bicep/Terraform modules or clear patterns for recipes to declare outputs that contribute to the Radius graph.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think users who think that the Radius graph is very important for them will pay attention to the outputs in the recipes.

Not sure if this is doable but we may have a validator that enforces some sort of outputs in the user recipes. That tool can be added to the CI/CD pipelines (or can be used locally) and may check for the validity of recipes and their outputs specifically.

- Mitigation: Provide versioned resource types (e.g., `@2025-05-01-preview`), detailed migration guides, and potentially migration tooling.
- **Recipe Validation and Debugging**: Lack of strong, compile-time typing for recipes means invalid recipes might only be caught at registration or deployment time.
- Risk: Poor user experience due to difficult-to-debug deployment failures.
- Mitigation: Implement robust validation checks upon recipe registration (schema, parameters, outputs). Enhance CLI tooling for local recipe validation and testing.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree! We need to build this tool.

- Validation: Test recipe deployments and inspect the resulting Radius graph.
- **Question**: What is the most effective way for recipes to declare their input parameters and output properties to ensure consistency and enable validation?
- Exploration: Define a clear contract for recipes, potentially using a schema or metadata definition that can be validated.
- **Question**: How can platform engineers easily test and debug their custom recipes before registering them in a live environment?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we mean deploying the resource that the recipe defines locally? We can have a make command for this that would spin up a local cluster and deploys the recipe. Not sure what we can do for cloud resources though.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, I think locally is a good start, sounds like @sylvainsf has this on his radar.


## Details of user problem
<!-- <Write this in first person. You basically want to summarize what “I” as a user am trying to accomplish, why the current experience is a problem and the impact it has on me, my team, my work and or biz, etc…. i.e. “When I try to do x aspect of cloud native app development, I have the following challenges / issues….<details>. Those issues result in <negative impact those challenges / issues have on my work and or business.> -->
When I, as a platform engineer, try to use Radius to deploy and manage applications across my organization, I face significant hurdles if our infrastructure strategy involves more than just Kubernetes. For example, if a development team wants to deploy a service to AWS Elastic Container Service (ECS) for cost or simplicity, or if we need to integrate with a managed cloud gateway service instead of the default Radius gateway on Kubernetes, I can't easily make Radius do this. I'm forced to tell my teams they can only use Radius for Kubernetes, or I have to build and maintain complex workarounds outside of Radius. This means either Radius doesn't fit our diverse needs, or I'm stuck maintaining a custom version of Radius or else needing to contribute core code changes upstream in to Radius, which is a huge operational burden and makes upgrades very risky. These limitations prevent us from fully leveraging Radius as a unified application platform across our varied infrastructure.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great explanation of the problem. As I mentioned above, if we can also provide a very rich library, it would make things very easy for development teams.

We should also think about the possibility of extending an existing extensibility recipe. Let's say User/Company X developed deploying to ECS and published it to the library. Now, User/Company Y wants to use it but needs to add more functionality. We can have a capability of extends.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a great idea, because then recipe authors don't have to merge upstream changes though they'd still have to test for breaking changes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Versioning may also work here. Users can extend a specific version of the recipe.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've created a feature request for this @ytimocin , good suggestion!
radius-project/radius#9820


#### Packaging and Registering a "Recipe Pack" for an Environment:

1. **Define a Recipe Pack**:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would also be very helpful in the path to become more extensible.

}
}
- providers: {
- // provider configurations no longer hard-coded here
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we saying we will add info such as subscription and respurce grpup to the bicep recipe itself?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have a requirement from some users that we will need to move those to the environment

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On second thought, this shouldn't be encoded in the recipe. We can keep providers as is for now.

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
* Once the Recipe Pack is registered, the environment is configured with all the specified recipes for the core UDTs.
* When applications are deployed to this environment, Radius automatically uses the corresponding recipes from the pack to provision `Applications.Core/containers@2025-05-01-preview`, `Applications.Core/gateways@2025-05-01-preview`, and `Applications.Core/secretStores@2025-05-01-preview` resources.
1. **Manage and Update Recipe Packs**:
* Platform engineers can update the Recipe Pack manifest (e.g., point to new recipe versions, change default parameters) and re-register it. The CLI could offer options to overwrite existing registrations or manage versions of the pack within the environment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to design/review/implement recipe versioning. Will that be a prerequisite before we work on recipe packs?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Recipes versioning will be a separate feature that we don't need to implement as a part of Recipe Packs. However, we should include versioning in scope for the implementation of Recipe Packs from the get go, even if the underlying Recipes packaged within the Pack don't support versioning yet.

Clarified this in the goals/non-goals

- }
]
// This container requests confidential compute
+ runtimes: {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the confidential compute property be part of the ACI-specific recipe? Or is this an interim case while we look at Radius supporting conf containers?

Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>

This scenario highlights that the application definition remains consistent. The underlying infrastructure and specific compute capabilities (standard vs. confidential) are determined by the recipes configured in the target Radius environment, allowing for flexible deployment to diverse compute platforms without altering the core application logic or Bicep code.

#### Creating and registering custom Recipes for core types:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this mean that we would allow end users to use their own core types (containers, gateways, secretstores) and disable ours?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct, or rather, users may use any recipes to instantiate any of the core types, OR they (platform engs) may register their own versions of the core types that will also be instantiated using corresponding Recipes.

2. **Discover/Create Recipes**:
* Find community-provided recipes for desired platforms (e.g., ACI, AWS Fargate) from an OCI registry or Radius documentation.
* Or, create custom Bicep/Terraform recipes for `Applications.Core/containers@2025-05-01-preview`, `Applications.Core/gateways@2025-05-01-preview`, and `Applications.Core/secretStores@2025-05-01-preview` to target a specific platform or customize existing behavior.
3. **Register Recipes for Core Types**:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to constraint certain app files to be used against only certain recipe? Example: App with confidential container property set to true, should be allowed only on confidential recipe.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not currently, we discussed this as well as the ability to only allow certain apps to use certain options/properties in a recipe.


#### Packaging and Registering a "Recipe Pack" for an Environment:

1. **Define a Recipe Pack**:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are recipe packs needed for extensibility?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea is that users need a convenient way to register recipes in bulk for specific platforms (e.g. registering the pack for ACI instead of knowing about and having to register individual recipes for ACI, Azure gateway, Key Vault, Azure Volumes, etc. that are needed to deploy to ACI)


## Topic Summary
<!-- A paragraph or two to summarize the topic area. Just define it in summary form so we all know what it is. -->
Radius will be enhanced to support multiple compute platforms, secret stores, and gateway resources through a recipe-based extensibility model. This approach decouples Radius's core logic from platform-specific provisioning code. Core resource types (`containers`, `gateways`, and `secretStores`) will be implemented as User-Defined Types (UDTs) and will allow platform engineers to register Bicep or Terraform recipes for them. Radius will provide default recipes for Kubernetes and Azure Container Instances (ACI), but platform engineers can use, modify, or replace these to customize how Radius provisions resources to different environments, or to add support for entirely new platforms without requiring changes to Radius core.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't core resource types include volumes?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, it should. i'll add it.

A platform engineer customizes the default Kubernetes recipes for `Applications.Core/containers@2025-05-01-preview` (and similarly for `gateways` and `secretStores`) to align with company-specific infrastructure policies, such as adding mandatory security sidecars, custom labels for cost tracking, or integrating with internal monitoring systems, by modifying the recipe and re-registering it.

### Scenario 3: Extend Radius to a new, unsupported platform
A platform engineer creates new Bicep or Terraform recipes to enable Radius to deploy `Applications.Core/containers@2025-05-01-preview` to AWS Fargate, `Applications.Core/gateways@2025-05-01-preview` to an AWS Application Load Balancer, and `Applications.Core/secretStores@2025-05-01-preview` to AWS Secrets Manager. They then register these recipes in their Radius environment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
A platform engineer creates new Bicep or Terraform recipes to enable Radius to deploy `Applications.Core/containers@2025-05-01-preview` to AWS Fargate, `Applications.Core/gateways@2025-05-01-preview` to an AWS Application Load Balancer, and `Applications.Core/secretStores@2025-05-01-preview` to AWS Secrets Manager. They then register these recipes in their Radius environment.
A platform engineer creates new Bicep or Terraform recipes to enable Radius to deploy `Applications.Core/containers@2025-05-01-preview` to AWS Elastic Container Service (ECS), `Applications.Core/gateways@2025-05-01-preview` to an AWS Application Load Balancer, and `Applications.Core/secretStores@2025-05-01-preview` to AWS Secrets Manager. They then register these recipes in their Radius environment.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fargate is just a compute option for ECS. Not the platform.

When I, as a platform engineer, try to use Radius to deploy and manage applications across my organization, I face significant hurdles if our infrastructure strategy involves more than just Kubernetes. For example, if a development team wants to deploy a service to AWS Elastic Container Service (ECS) for cost or simplicity, or if we need to integrate with a managed cloud gateway service instead of the default Radius gateway on Kubernetes, I can't easily make Radius do this. I'm forced to tell my teams they can only use Radius for Kubernetes, or I have to build and maintain complex workarounds outside of Radius. This means either Radius doesn't fit our diverse needs, or I'm stuck maintaining a custom version of Radius or else needing to contribute core code changes upstream in to Radius, which is a huge operational burden and makes upgrades very risky. These limitations prevent us from fully leveraging Radius as a unified application platform across our varied infrastructure.

## Desired user experience outcome
<!-- <Write this as an “I statement” that expresses the new capability from user perspective … i.e. After this scenario is implemented “I can do, x, y, z, steps in cloud native app developer and seamlessly etc... As a result <summarize positive impact on my work / business> -->
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Azure Container Instances, AWS Fargate, or a future platform

Should be serverless container platforms including Azure Container Instances, Azure Container Apps, AWS ECS, Google CloudRun, and functions platforms including AWS Lambda, Azure Functions, and Google Cloud Functions.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't re-use the container resource for functions, we should consider publishing a new core type of function.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks, edited

}
}
}
- providers: {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The provider stores the AWS and Azure details that get past to the recipe context right? https://docs.radapp.io/reference/context-schema/#environment So we'll need the AWS account and region, and Azure subscription and resource group in the environment somewhere.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, good point, this shouldn't be encoded in the recipe. We can keep providers in the environment as is for now.

* The platform engineer configures `std-env` with recipes for `Applications.Core/containers@2025-05-01-preview` that deploy to standard compute (e.g., regular ACI or Kubernetes pods). These recipes might ignore or log a warning for confidential container requests if they don't support them.
* Example recipe registration (conceptual):
```bash
rad recipe register std-container-recipe --environment std-env \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I strongly believe we should not have any recipe names. This leaks the implementation abstraction into the developers' world. If the developer needs a different recipe, that should be a different resource type.

// This container requests confidential compute
extensions: [
{
kind: 'confidentialCompute' // Example extension kind
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there are additional properties needed to be set by the developer, that should be a different resource type. I do not think extension is the right thing here, nor do I understand how one would create an extension.

3. **Developer/CI/CD: Deploy the Same Application Definition to Both Environments**
* **Deploy to Standard Environment:**
* `rad deploy ./app.bicep --environment std-env`
* Radius uses the `std-container-recipe` registered in `std-env`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Radius will use the default recipe unless named by the developer. But specifying the recipe name is only supported by portable resource types today.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was a mistake, corrected them all to be registered as default


1. **Define a Recipe Pack**:
* A platform engineer creates a manifest file (e.g., `recipe-pack.json` or `recipe-pack.yaml`) that defines a collection of recipes. This manifest would list each core resource type (e.g., `Applications.Core/containers@2025-05-01-preview`, `Applications.Core/gateways@2025-05-01-preview`, `Applications.Core/secretStores@2025-05-01-preview`) and associate it with a specific recipe (OCI URI or local path) and its default parameters.
* Example `recipe-pack.yaml`:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there anything here that isn't just an Environment? Sort of seems redundant.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@brooke-hamilton asked a similar question, see answer in a previous comment: https://github.com/radius-project/design-notes/pull/96/files#r2141274374

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This question has come up a few times. I've added it to the "Questions to answer" section of this spec.

1. **Configure Environment-Specific Recipe Parameters (Optional)**:
* If recipes have parameters that need to be set globally for an environment, configure them using `rad recipe update` or during registration.

#### Packaging and Registering a "Recipe Pack" for an Environment:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A "resource pack" would be more useful. It would be a manifest of resource types and associated recipes. I would specify the resource pack during rad init.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we define a set of resources and a set of recipes within a single environment resource, and deploy that? That could replace the need for recipe or resource packs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@brooke-hamilton see answer in a previous comment: https://github.com/radius-project/design-notes/pull/96/files#r2141274374

@zachcasper - I'm thinking Recipes and Resources would be bundled into the same pack - it seems pointless to have them separately as one wouldn't be used without the other. Thoughts?

```
1. **Package the Recipe Pack (Optional but Recommended)**:
* The manifest file and any local recipe files (if not using OCI URIs exclusively) could be bundled into an OCI artifact or a simple archive (e.g., .zip, .tar.gz) for easier distribution and versioning.
1. **Register the Recipe Pack to an Environment**:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Register isn't the right verb here. We're configuring the environment. rad environment create --recipe-pack <location> seems more accurate.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, I've changed it to leverage the rad environment update my-env --recipe-pack ... command instead.

6. **Update CI/CD Pipelines**:
* Modify CI/CD pipelines to use the updated application Bicep files and any new CLI commands or Radius versions required for the UDT model.

## Key investments
Copy link
Contributor

@lakshmimsft lakshmimsft Jun 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to mention user experience when there are errors either at registering or deployment. We could deploy partial resources and users will need to be aware.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've added error scenario details to the user scenarios section.

Copy link
Member

@brooke-hamilton brooke-hamilton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great document! 🤖 🚀

source: cache.id
}
}
extensions: [
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the need for extensions, aka "punch through", goes away with RRTs and recipes. If a platform engineering team needs platform-specific configuration they would implement it in the recipe and maybe provide the developers with configuration options in the RRT.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While I agree with your perspective on this, I'm inclined to keep the Dapr configurations as-is for now (i.e. within the extensions property) but removing everything else out of extensions. I think the removal of Dapr as a built-in first class integration in Radius is out of scope for this feature spec as that requires a separate set of considerations that is orthogonal to the compute extensibility goals.

If needed, we can discuss further, @brooke-hamilton

#### Creating and registering custom Recipes for core types:
1. **Create and Register Recipes for Core Types**:
* Create custom Bicep/Terraform recipes for `Applications.Core/containers@2025-05-01-preview`, `Applications.Core/gateways@2025-05-01-preview`, and `Applications.Core/secretStores@2025-05-01-preview` to target a specific platform or customize existing behavior.
* Publish these recipes to an OCI registry for Bicep or a Terraform module repository.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we also have a platform engineering scenario in which someone is developing a recipe and iterating through multiple changes to the recipe and RRT? It would be nice to have the ability to register a recipe and RRT that are on the local dev machine, without having to upload to an OCI registry.

Another scenario might be to clone a repo that contains RRTs and recipes, and register them as local files instead of being in an OCI registry.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great idea, I added some scenarios for this.

Comment on lines +130 to +158
resource env 'Applications.Core/environments@2025-05-01-preview' = {
name: 'my-aci-env'
properties: {
- compute: {
- // compute kind is no longer hard-coded here
- }
recipes: {
'Applications.Core/containers': {
default: {
templateKind: 'bicep'
plainHttp: true
templatePath: 'ghcr.io/radius-project/recipes/azure/aci-container:latest'
parameters: {
defaultCpu: 1
defaultMemoryInGB: 2
}
}
}
'Applications.Core/gateways': {
default: {
templateKind: 'bicep'
plainHttp: true
templatePath: 'ghcr.io/radius-project/recipes/azure/aci-gateway:latest'
parameters: {
defaultCpu: 1
defaultMemoryInGB: 2
}
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This example nicely demonstrates how recipes can be packaged with an environment. Do we need recipe packs if we have this capability? For example, if I want to deploy to XYZ platform, I can define an environment that contains all the recipes needed to deploy to that platform.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The convenience of Recipe packs will be needed so that platform engineers don't have to piece together individual Recipes for each environment from scratch. Putting everything together manually each time also opens up the door for error (e.g. forgetting to include gateway Recipes). I think what you're describing might be a good solution for grouping collections of Recipe packs - e.g. I bundle ACI and OpenAI Recipe packs together in an Environment.

willtsai added 9 commits June 12, 2025 11:01
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
- Default Recipes can be leveraged for the standard container resource type for platforms that don't require platform-specific configurations. For example, the default Kubernetes Recipe can be used for the standard container resource type without any modifications, while the ACI Recipe can be modified to leverage the platform-specific capabilities.

**Cons:**
- Exposing the entire set of container configurations in order to allow for platform specific capabilities may be too broad of an abstraction punch-through, resulting in container infrastructure configurations being split or duplicated across two places (i.e. in the container resource definition itself and in the Recipe).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is a property setting exposing too much to the developers? runtimes should be something they never mess with unless in coordination with the recipe writers. I'd expect it to be optional

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We solicited feedback from a Radius user (platform engineering team) who was against exposing this to developers. Their reasoning was that such a punch-through exposed to developers can lead to misuse and complications as the container contract becomes ambiguous (i.e. they have to manage a separate contract with their developers on what is and isn't allowed in the punch-through). They prefer to keep the core properties limited and manage additional requirements through platform engineering.

This option is where the advanced capabilities are not exposed in the standard container properties provided by Radius out of the box, but rather require platform engineers to modify the container resource definitions to enable these capabilities. This could be done by creating a custom Radius Resource Type (RRT) that extends the standard container RRT to include platform-specific properties or configurations.

**Pros:**
- Keeps the standard container resource type clean and focused on core properties, avoiding clutter from platform-specific configurations or misuse of advanced container configurations by developers.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is this cleaner than a runtimes property not used by developers in 99% of cases?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the common container properties that make up 90% of the developer use cases need to be elevated into the top-level container properties in the core container resource type. Properties such as restartPolicy that aren't part of the top-level container properties today should added into the core container RRT as this is a configuration common across platforms. This would be the mitigation against the strong need for punch-throughs today.

<!-- What role does Recipe packs play in this feature? What are solutions for bundling together multiple packs of Recipes? -->
This specification proposes the introduction of "Recipe Packs" to group related Recipes together for easier management and deployment. The convenience of Recipe packs will be needed so that platform engineers don't have to piece together individual Recipes for each environment from scratch, as a single Recipe Pack may be re-used for many Environments. Putting everything together manually each time also opens up the door for error (e.g. forgetting to include gateway Recipes).

There were several questions about whether Environments, to which platform engineers may register multiple Recipes, essentially serve the same purpose and thus negates the need for Recipe Packs. While this is a valid point, it lacks the flexibility that a dedicated Recipe Pack feature provides where a Recipe Pack can have a lifecycle independent of the Environment and thus may be re-used for many Environments. The Environment definition remains a good place to group collections of Recipe packs - e.g. bundle ACI and OpenAI Recipe packs together in an Environment definition.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Community recipe packs could be everything to stand up a new type like Neo4J, etc which contains several recipes for implementation.

- Platform engineers must modify the container resource definitions to enable advanced capabilities, which may require additional effort and coordination.
- Limits the ability of developers to leverage advanced container features without involving platform engineers, potentially slowing down the development process.
- Default Recipes may not be registered for the custom container RRT that is created to leverage platform-specific capabilities, requiring platform engineers to create and register custom Recipes for each platform they want to deploy to.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could we publish both to our official definitions?

Radius.Resources/containers
Radius.Resources/extensibleContainers

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting idea, but I'm inclined to take a stance on an approach and let that be the official definition published. I think it'll add extra confusion to include too many options out of the box.

willtsai added 11 commits June 20, 2025 15:58
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.