Skip to content

Add DeploymentTemplate controller for GitOps support - #8001

Merged
willdavsmith merged 77 commits into
radius-project:mainfrom
willdavsmith:deploymenttemplatecontroller
Jan 28, 2025
Merged

willdavsmith merged 77 commits into
radius-project:mainfrom
willdavsmith:deploymenttemplatecontroller

Conversation

@willdavsmith

@willdavsmith willdavsmith commented Oct 17, 2024 •

Copy link
Copy Markdown
Contributor

Description

  • Add rad bicep generate-kubernetes-manifest CLI
  • Add DeploymentTemplate controller
  • Add DeploymentResource controller

Type of change

  • This pull request adds or changes features of Radius and has an approved issue (issue link required).

#6689

Contributor checklist

Please verify that the PR meets the following requirements, where applicable:

  • An overview of proposed schema changes is included in a linked GitHub issue.
  • A design document PR is created in the design-notes repository, if new APIs are being introduced.
  • If applicable, design document has been reviewed and approved by Radius maintainers/approvers.
  • A PR for the samples repository is created, if existing samples are affected by the changes in this PR.
  • A PR for the documentation repository is created, if the changes in this PR affect the documentation or any user facing updates are made.
  • A PR for the recipes repository is created, if existing recipes are affected by the changes in this PR.

Comment thread pkg/cli/bicep/deployment_parameters.go Resolved
Comment thread pkg/cli/cmd/deploy/deploy_test.go Outdated
})

t.Run("Deployment with missing parameters", func(t *testing.T) {
//t.Skip()

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

removing commented out t.Skip()

@willdavsmith willdavsmith changed the title [WIP/ Do not review] Flux support Add DeploymentTemplate controller Nov 1, 2024
@willdavsmith
willdavsmith marked this pull request as ready for review November 1, 2024 20:14
@willdavsmith
willdavsmith requested review from a team as code owners November 1, 2024 20:14
@radius-functional-tests

radius-functional-tests Bot commented Nov 1, 2024 •

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Name Value
Repository willdavsmith/radius
Commit ref a774840
Unique ID func56e23e2717
Image tag pr-func56e23e2717
Click here to see the list of tools in the current test run
  • gotestsum 1.12.0
  • KinD: v0.20.0
  • Dapr: 1.12.0
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-func56e23e2717
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-func56e23e2717
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-func56e23e2717
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-func56e23e2717
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting corerp-cloud functional tests...
⌛ Starting ucp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded

Comment thread bicep-types Resolved

@brooke-hamilton brooke-hamilton left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I ran make generate build test and got 8 failures.

=== FAIL: pkg/cli/cmd/bicep/generatekubernetesmanifest Test_Run/Create_basic_DeploymentTemplate (0.00s)
=== FAIL: pkg/cli/cmd/bicep/generatekubernetesmanifest Test_Run/Create_DeploymentTemplate_with_template_content (0.00s)
=== FAIL: pkg/cli/cmd/bicep/generatekubernetesmanifest Test_Run/Create_DeploymentTemplate_with_Azure_scope (0.00s)
=== FAIL: pkg/cli/cmd/bicep/generatekubernetesmanifest Test_Run/Create_DeploymentTemplate_with_AWS_scope (0.00s)
=== FAIL: pkg/cli/cmd/bicep/generatekubernetesmanifest Test_Run (0.00s)
=== FAIL: pkg/controller/reconciler Test_DeploymentResourceReconciler_Basic (10.01s)
=== FAIL: pkg/controller/reconciler Test_DeploymentTemplateReconciler_Basic (0.01s)
=== FAIL: pkg/controller/reconciler Test_DeploymentTemplateReconciler_FailureRecovery (0.00s)

Here's one example:

=== FAIL: pkg/cli/cmd/bicep/generatekubernetesmanifest Test_Run/Create_DeploymentTemplate_with_Azure_scope (0.00s)
Creating DeploymentTemplate YAML file
    generatekubernetesmanifest_test.go:396: 
                Error Trace:    /workspaces/radius/pkg/cli/cmd/bicep/generatekubernetesmanifest/generatekubernetesmanifest_test.go:396
                Error:          Not equal: 
                                expected: "apiVersion: radapp.io/v1alpha3\nkind: DeploymentTemplate\nmetadata:\n  name: azure.yaml\n  namespace: radius-system\nspec:\n  parameters: '{}'\n  providerConfig: '{\"radius\":{\"type\":\"radius\",\"value\":{\"scope\":\"/planes/radius/local/resourceGroups/test-resource-group\"}},\"az\":{\"type\":\"azure\",\"value\":{\"scope\":\"/subscriptions/test-subId/resourceGroups/test-rg\"}},\"deployments\":{\"type\":\"Microsoft.Resources\",\"value\":{\"scope\":\"/planes/radius/local/resourceGroups/test-resource-group\"}}}'\n  template: '{}'\n"
                                actual  : "apiVersion: radapp.io/v1alpha3\nkind: DeploymentTemplate\nmetadata:\n  name: azure.yaml\n  namespace: radius-system\nspec:\n  parameters: '{}'\n  providerConfig: '{\"radius\":{\"type\":\"radius\",\"value\":{\"scope\":\"/planes/radius/local/resourceGroups/test-resource-group\"}},\"az\":{\"type\":\"azure\",\"value\":{\"scope\":\"/subscriptions/test-subId/resourceGroups/test-rg\"}},\"deployments\":{\"type\":\"Microsoft.Resources\",\"value\":{\"scope\":\"/planes/radius/local/resourceGroups/test-resource-group\"}}}'\n  repository: azure.yaml\n  template: '{}'\n"
                            
                                Diff:
                                --- Expected
                                +++ Actual
                                @@ -8,2 +8,3 @@
                                   providerConfig: '{"radius":{"type":"radius","value":{"scope":"/planes/radius/local/resourceGroups/test-resource-group"}},"az":{"type":"azure","value":{"scope":"/subscriptions/test-subId/resourceGroups/test-rg"}},"deployments":{"type":"Microsoft.Resources","value":{"scope":"/planes/radius/local/resourceGroups/test-resource-group"}}}'
                                +  repository: azure.yaml
                                   template: '{}'
                Test:           Test_Run/Create_DeploymentTemplate_with_Azure_scope
    --- FAIL: Test_Run/Create_DeploymentTemplate_with_Azure_scope (0.00s)

@brooke-hamilton brooke-hamilton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Running make generate results in these files being changed.

deploy/Chart/crds/radius/radapp.io_deploymentresources.yaml
deploy/Chart/crds/radius/radapp.io_deploymenttemplates.yaml
deploy/Chart/crds/radius/radapp.io_recipes.yaml
deploy/Chart/crds/ucpd/ucp.dev_queuemessages.yaml
deploy/Chart/crds/ucpd/ucp.dev_resources.yaml

For example, controller-gen.kubebuilder.io/version: v0.16.4 changes to controller-gen.kubebuilder.io/version: v0.16.0

Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Signed-off-by: willdavsmith <willdavsmith@gmail.com>
@radius-functional-tests

radius-functional-tests Bot commented Jan 27, 2025 •

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Name Value
Repository willdavsmith/radius
Commit ref 72de369
Unique ID funcf5c609a02f
Image tag pr-funcf5c609a02f
Click here to see the list of tools in the current test run
  • gotestsum 1.12.0
  • KinD: v0.20.0
  • Dapr:
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-funcf5c609a02f
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-funcf5c609a02f
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-funcf5c609a02f
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-funcf5c609a02f
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-funcf5c609a02f
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting corerp-cloud functional tests...
⌛ Starting ucp-cloud functional tests...
❌ corerp-cloud functional test failed. Please check the logs for more details
❌ ucp-cloud functional test cancelled. Please check the logs for more details
⌛ Starting corerp-cloud functional tests...
⌛ Starting ucp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded

type ResourceDeploymentClient struct {
RadiusResourceGroup string
Client *sdkclients.ResourceDeploymentsClient
Client sdkclients.ResourceDeploymentsClient

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I changed this from a struct to an interface (since I use the same type in deploymenttemplate controller). This makes testing way easier.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It should not impact the functionality at all.

resourceDeploymentClient := ResourceDeploymentClient{
RadiusResourceGroup: "testrg",
Client: &sdkclients.ResourceDeploymentsClient{},
OperationsClient: &sdkclients.ResourceDeploymentOperationsClient{},

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

These weren't actually doing anything in the test. We should write tests using the interface like I do in the deploymenttemplate controller unit tests.

sdkclients "github.com/radius-project/radius/pkg/sdk/clients"
)

type DeploymentClient interface {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I added this DeploymentClient interface (similar to the existing RadiusClient interface) because the deploymenttemplate controller needs to access the UCP deployment client. Having this interface makes it possible to write out mocks for testing.

@@ -75,6 +76,13 @@ func (rc *mockRadiusClient) Update(exec func()) {
exec()
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The changes in this file are for clarity. I was getting very confused when adding a new client, so I made it explicit that these operations are for the RadiusClient

See the License for the specific language governing permissions and
limitations under the License.
*/

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This isn't new code, I just moved it from the existing RadiusClient (because it's shared by RadiusClient and DeploymentClient now)

@@ -29,15 +27,6 @@ import (
"github.com/radius-project/radius/pkg/ucp/resources"
)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The changes in this file are only for clarity. functionality is unaffected

type bicepDriver struct {
ArmClientOptions *arm.ClientOptions
DeploymentClient *clients.ResourceDeploymentsClient
DeploymentClient clients.ResourceDeploymentsClient

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Swapping to use interface instead of struct

req.Raw().Header["Accept"] = []string{"application/json"}
return req, runtime.MarshalAsJSON(req, parameters)
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I had to add some functionality to the ResourceDeploymentsClient for async processing. Today we just call PollUntilDone() in the CLI deployment and bicep driver.

waitForDeploymentTemplateStateDeleted(t, k8sClient, namespacedName)
}

func Test_DeploymentTemplateReconciler_OutputResources(t *testing.T) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

return runtime.NewPollerFromResumeToken[ClientCreateOrUpdateResponse](resumeToken, *client.pipeline, nil)
}

func (client *ResourceDeploymentsClientImpl) Delete(ctx context.Context, resourceID, apiVersion string) (*runtime.Poller[ClientDeleteResponse], error) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pls add comment for function.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

added

connection sdk.Connection
}

func NewDeploymentClient(connection sdk.Connection) *DeploymentClientImpl {

@lakshmimsft lakshmimsft Jan 27, 2025 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

comments needed for exported type/functions

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

fixed


// Phrase indicates the current status of the Deployment Resource.
Phrase DeploymentResourcePhrase `json:"phrase,omitempty"`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Was this unused before?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I can't tell exactly what this is referring to but if it's the ProviderConfig, yes it's unused now that I'm using the DeploymentsClient instead of the RadiusClient.

Signed-off-by: willdavsmith <willdavsmith@gmail.com>
@radius-functional-tests

radius-functional-tests Bot commented Jan 27, 2025 •

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Name Value
Repository willdavsmith/radius
Commit ref cfa5f66
Unique ID func84b31ab145
Image tag pr-func84b31ab145
Click here to see the list of tools in the current test run
  • gotestsum 1.12.0
  • KinD: v0.20.0
  • Dapr:
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-func84b31ab145
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-func84b31ab145
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-func84b31ab145
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-func84b31ab145
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-func84b31ab145
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting ucp-cloud functional tests...
⌛ Starting corerp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded


// ResourceDeploymentsClient is an interface for interacting
// with UCP Deployments.
type ResourceDeploymentsClient interface {

@sk593 sk593 Jan 27, 2025 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'm a little confused by the naming choice. We already have a ResourceDeploymentsClient used in the SDK clients package:

type ResourceDeploymentsClient interface {

Based on the code, it seems like these are both deployment clients that serve UCP (although the one linked above serves Azure and UCP) so why are we redefining the interface? If both `ResourceDeploymentsClient are meant to serve different purposes or serve different deployments (Azure/UCP vs deployment resources/templates), I think we should rename this for clarity.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

They do the same thing - I think we could consolidate them. I think I would rather handle this together with other changes later to move the mocks outside of reconciler package though.

var _ DeploymentClient = (*DeploymentClientImpl)(nil)

// CreateOrUpdate creates or updates a deployment.
func (rdc *ResourceDeploymentsClientImpl) CreateOrUpdate(ctx context.Context, parameters sdkclients.Deployment, resourceID, apiVersion string) (Poller[sdkclients.ClientCreateOrUpdateResponse], error) {

@sk593 sk593 Jan 27, 2025 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is rdc *ResourceDeploymentsClientImpl the correct value? Should it not be DeploymentClientImpl?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I think this is right. ResourceDeploymentsClientImpl is the type that has all of the actual functions, DeploymentClientImpl just has an accessor (ResourceDeployments())

var _ ResourceDeploymentsClient = (*ResourceDeploymentsClientImpl)(nil)

// ResourceDeploymentsClientImpl is an implementation of ResourceDeploymentsClient.
type ResourceDeploymentsClientImpl struct {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Can you explain why we're choosing to wrap the ResourceDeploymentsClient from sdkclients and also defined a new ResourceDeploymentsClient in this file? I'm not sure I see the 2 distinct use cases here

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

They're the same - we can merge them. For now, I wanted to keep the code in the reconciler package to match the RadiusClient. We can consolidate after

Signed-off-by: willdavsmith <willdavsmith@gmail.com>

// DeploymentEngineClient is the client for interacting with the deployment engine.
DeploymentEngineClient *clients.ResourceDeploymentsClient
DeploymentEngineClient clients.ResourceDeploymentsClient

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is struct -> interface, shouldn't affect functionality

@radius-functional-tests

radius-functional-tests Bot commented Jan 28, 2025 •

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Name Value
Repository willdavsmith/radius
Commit ref 4101258
Unique ID funcd908053173
Image tag pr-funcd908053173
Click here to see the list of tools in the current test run
  • gotestsum 1.12.0
  • KinD: v0.20.0
  • Dapr:
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-funcd908053173
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-funcd908053173
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-funcd908053173
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-funcd908053173
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-funcd908053173
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting ucp-cloud functional tests...
⌛ Starting corerp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded

Signed-off-by: willdavsmith <willdavsmith@gmail.com>
@radius-functional-tests

radius-functional-tests Bot commented Jan 28, 2025 •

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Name Value
Repository willdavsmith/radius
Commit ref be4c051
Unique ID func9d668a1917
Image tag pr-func9d668a1917
Click here to see the list of tools in the current test run
  • gotestsum 1.12.0
  • KinD: v0.20.0
  • Dapr:
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-func9d668a1917
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-func9d668a1917
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-func9d668a1917
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-func9d668a1917
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-func9d668a1917
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting ucp-cloud functional tests...
⌛ Starting corerp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded

@sk593 sk593 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:shipit:

This branch was previously deployed

2 inactive deployments
functional-tests — be4c0518 Deployed Jan 28, 2025 by willdavsmith
publish-bicep — be4c0518 Deployed Jan 28, 2025 by willdavsmith
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.

6 participants