cmd

package
v0.61.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 30, 2026 License: Apache-2.0 Imports: 18 Imported by: 0

README

CLI Commands

This package pkg/cli/cmd is the root for our CLI commands. Commands are organized according to their hierarchy of sub-commands. For example rad resource show would be located in pkg/cli/cmd/resource/show/show.go.

Some of our command names are reserved words in Go and so they can't be used as package names. When this happens add a prefix from the parent command. eg: switch -> appswitch.

Each command is its own package to discourage accidentally sharing code between commands. Any functionality that needs to be shared should be moved to another location outside of pkg/cli/cmd.

Make sure to run make test-validate-cli to get the test coverage for the file you have added tests.

Template

Here's a useful template for a new (blank) command.

/*
Copyright 2023 The Radius Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
    
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package list

import (
	"context"

	"github.com/radius-project/radius/pkg/cli"
	"github.com/radius-project/radius/pkg/cli/cmd/commonflags"
	"github.com/radius-project/radius/pkg/cli/framework"
	"github.com/radius-project/radius/pkg/cli/output"
	"github.com/radius-project/radius/pkg/cli/workspaces"
	"github.com/spf13/cobra"
)

// NewCommand creates an instance of the `rad <fill in the blank>` command and runner.
func NewCommand(factory framework.Factory) (*cobra.Command, framework.Runner) {
	runner := NewRunner(factory)

	cmd := &cobra.Command{
		Use:     "",
		Short:   "",
		Long:    "",
		Example: ``,
		Args:    cobra.ExactArgs(2),
		RunE:    framework.RunCommand(runner),
	}

	// Define your flags here
	commonflags.AddOutputFlag(cmd)
	cmd.Flags().StringP("flagName", "k (flag's shorthand notation like w for workspace)", "", "What does the flag ask for")

	return cmd, runner
}

// Runner is the Runner implementation for the `rad <fill in the blank>` command.
type Runner struct {
	ConfigHolder *framework.ConfigHolder
	Output       output.Interface
	Format       string
	Workspace    *workspaces.Workspace
}

// NewRunner creates an instance of the runner for the `rad <fill in the blank>` command.
func NewRunner(factory framework.Factory) *Runner {
	return &Runner{
		ConfigHolder: factory.GetConfigHolder(),
		Output:       factory.GetOutput(),
	}
}

// Validate runs validation for the `rad <fill in the blank>` command.
func (r *Runner) Validate(cmd *cobra.Command, args []string) error {
	// Validate command line args and
	workspace, err := cli.RequireWorkspace(cmd, r.ConfigHolder.Config, r.ConfigHolder.DirectoryConfig)
	if err != nil {
		return err
	}
	r.Workspace = workspace

	format, err := cli.RequireOutput(cmd)
	if err != nil {
		return err
	}
	r.Format = format

	return nil
}

// Run runs the `rad <fill in the blank>` command.
func (r *Runner) Run(ctx context.Context) error {
	// Implement your command here
	return nil
}

Here's a useful template for testing the new command.

/*
Copyright 2023 The Radius Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
    
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package show

import (
	"testing"

	"github.com/radius-project/radius/pkg/cli/framework"
	"github.com/radius-project/radius/test/radcli"
)

func Test_CommandValidation(t *testing.T) {
	radcli.SharedCommandValidation(t, NewCommand)
}

func Test_Validate(t *testing.T) {
	config := radcli.LoadConfigWithWorkspace(t)
	testcases := []radcli.ValidateInput{
		{
			Name:          "example validation test",
			Input:         []string{"show", "-s", "cool-value"},
			ExpectedValid: true,
			ConfigHolder:  framework.ConfigHolder{Config: config},
		},
	}
	radcli.SharedValidateValidation(t, NewCommand, testcases)
}

func Test_Run(t *testing.T) {
	t.Run("Validate Scenario 1", func(t *testing.T) {
		
	})
	t.Run("Validate Scenario 2", func(t *testing.T) {
		
	})
	t.Run("Validate Scenario 3", func(t *testing.T) {
		
	})
	t.Run("Validate Scenario i", func(t *testing.T) {
		
	})
}

Documentation

Index

Constants

View Source
const MsgDeletingResource = "  Deleting %s..."

MsgDeletingResource is logged for each resource before its deletion is started.

View Source
const MsgSkippingResource = "  Warning: skipping %s because its resource ID or type is missing. It must be deleted manually."

MsgSkippingResource is logged for each resource the cascade cannot delete, so the count shown in the confirmation prompt cannot quietly disagree with what was actually deleted.

Variables

This section is empty.

Functions

func CheckIfRecipeExists

func CheckIfRecipeExists(ctx context.Context, client clients.ApplicationsManagementClient, environmentName string, recipeName string, resourceType string) (corerp.EnvironmentResource, map[string]map[string]corerp.RecipePropertiesClassification, error)

CheckIfRecipeExists checks if a given recipe exists in a given environment and returns the environment resource, recipe properties and an error if the recipe does not exist.

func CreateEnvProviders

func CreateEnvProviders(providersList []any) (corerp.Providers, error)

CreateEnvProviders iterates through a list of providers and creates a corerp.Providers object with the appropriate scopes for each provider type (Azure or AWS). If more than one provider of the same type is found, an error is returned.

If an invalid type is found, an error is returned.

func DeleteResourcesInParallel added in v0.61.0

func DeleteResourcesInParallel(ctx context.Context, client clients.ApplicationsManagementClient, out output.Interface, resources []generated.GenericResource, force bool) error

DeleteResourcesInParallel deletes the given resources concurrently, tolerating resources that have already been deleted. The ID of each resource is logged before its deletion is started, because output.Interface implementations are not guaranteed to be thread-safe and logging up front keeps the output deterministic.

A resource missing an ID or type cannot be addressed and is skipped with a warning rather than silently dropped, so the caller's reported count cannot disagree with what was deleted.

Deletions are limited to maxParallelDeletes at a time. On the first failure errgroup cancels the shared context, which abandons every other delete. Those deletes are left in mixed states: some were already accepted by the server and are still running there, some were canceled before the request was sent, and some queued behind the concurrency limit may never have started. The command reports a single error, so the outcome of the rest is unknown. Re-running the command is the way to converge, which is safe because deleting an already-deleted resource is treated as success.

func GetNamespace

func GetNamespace(envResource corerp.EnvironmentResource) string

GetNamespace takes in an EnvironmentResource object and returns a string representing the namespace associated with the KubernetesCompute object, or an empty string if the Compute property is not a KubernetesCompute object.

func InitializeClientFactory added in v0.48.0

func InitializeClientFactory(ctx context.Context, workspace *workspaces.Workspace) (*v20231001preview.ClientFactory, error)

InitializeClientFactory initializes a new v20231001preview.ClientFactory using the provided workspace context. It connects to the workspace and creates a new client factory with anonymous credentials. If the connection fails, it returns an error.

func InitializeRadiusCoreClientFactory added in v0.54.0

func InitializeRadiusCoreClientFactory(ctx context.Context, workspace *workspaces.Workspace) (*v20250801preview.ClientFactory, error)

InitializeRadiusCoreClientFactory initializes a new v20250801preview.ClientFactory using the provided workspace context. It connects to the workspace and creates a new client factory with anonymous credentials. If the connection fails, it returns an error.

func ListPreviewApplicationsInEnvironment added in v0.61.0

func ListPreviewApplicationsInEnvironment(ctx context.Context, client *corerpv20250801.ApplicationsClient, workspace *workspaces.Workspace, environmentID string) ([]corerpv20250801.ApplicationResource, error)

ListPreviewApplicationsInEnvironment lists the Radius.Core applications in the workspace scope whose properties.environment references the given environment ID.

func PopulateRecipePackClients added in v0.58.0

func PopulateRecipePackClients(
	ctx context.Context,
	workspace *workspaces.Workspace,
	clientsByScope map[string]*v20250801preview.RecipePacksClient,
	packIDs []string,
) error

PopulateRecipePackClients adds a RecipePacksClient to clientsByScope for every scope referenced by packIDs that is not already in the map. Callers seed the map with workspace-scope and default-scope clients before calling this function.

func PreviewApplicationID added in v0.61.0

func PreviewApplicationID(scope string, applicationName string) string

PreviewApplicationID builds a fully qualified Radius.Core application ID.

func PreviewEnvironmentID added in v0.61.0

func PreviewEnvironmentID(scope string, environmentName string) string

PreviewEnvironmentID builds a fully qualified Radius.Core environment ID.

func PreviewResourceID added in v0.61.0

func PreviewResourceID(scope string, resourceType string, name string) string

PreviewResourceID builds a fully qualified Radius.Core resource ID from a workspace scope, resource type and resource name.

Types

This section is empty.

Directories

Path Synopsis
app
bicep
env
namespace
Package namespace is a generated GoMock package.
Package namespace is a generated GoMock package.
Package radinit is a generated GoMock package.
Package radinit is a generated GoMock package.
recipepack
resource
resourceprovider
resourcetype
Package shutdown implements the `rad shutdown` command, which backs up all durable Radius state (PostgreSQL control-plane databases and Terraform state Secrets) for the current workspace to a state archive.
Package shutdown implements the `rad shutdown` command, which backs up all durable Radius state (PostgreSQL control-plane databases and Terraform state Secrets) for the current workspace to a state archive.
Package startup implements the `rad startup` command, which restores durable Radius state (PostgreSQL control-plane databases and Terraform state Secrets) previously saved by `rad shutdown` into the current workspace's running control plane.
Package startup implements the `rad startup` command, which restores durable Radius state (PostgreSQL control-plane databases and Terraform state Secrets) previously saved by `rad shutdown` into the current workspace's running control plane.
workspace
create/preview
Package preview implements the `rad workspace create --preview` command.
Package preview implements the `rad workspace create --preview` command.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL