Skip to content

Commit 2613dfe

Browse files
authored
Merge branch 'main' into dependabot/go_modules/go-dependencies-07f835f864
2 parents 4d9c348 + 1d1b316 commit 2613dfe

53 files changed

Lines changed: 5831 additions & 1264 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmd/rad/cmd/root.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import (
5858
"github.com/radius-project/radius/pkg/cli/cmd/install"
5959
install_kubernetes "github.com/radius-project/radius/pkg/cli/cmd/install/kubernetes"
6060
"github.com/radius-project/radius/pkg/cli/cmd/radinit"
61+
radinit_preview "github.com/radius-project/radius/pkg/cli/cmd/radinit/preview"
6162
recipe_list "github.com/radius-project/radius/pkg/cli/cmd/recipe/list"
6263
recipe_register "github.com/radius-project/radius/pkg/cli/cmd/recipe/register"
6364
recipe_show "github.com/radius-project/radius/pkg/cli/cmd/recipe/show"
@@ -342,6 +343,8 @@ func initSubCommands() {
342343
RootCmd.AddCommand(groupCmd)
343344

344345
initCmd, _ := radinit.NewCommand(framework)
346+
previewInitCmd, _ := radinit_preview.NewCommand(framework)
347+
wirePreviewSubcommand(initCmd, previewInitCmd)
345348
RootCmd.AddCommand(initCmd)
346349

347350
envCreateCmd, _ := env_create.NewCommand(framework)

pkg/cli/bicep/resources.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ var radiusNamespacePatterns = []string{
3939
type TemplateInspectionResult struct {
4040
// ContainsEnvironmentResource indicates whether the template contains an environment resource.
4141
ContainsEnvironmentResource bool
42+
43+
// EnvironmentResources contains the list of environment resources found in the template.
44+
EnvironmentResources []map[string]any
4245
}
4346

4447
// ResourceTypeEntry represents a parsed resource type from a compiled Bicep/ARM template.
@@ -169,6 +172,11 @@ func InspectTemplateResources(template map[string]any) TemplateInspectionResult
169172
strings.HasPrefix(resourceTypeLower, legacyEnvironmentResourceType) {
170173
result.ContainsEnvironmentResource = true
171174
}
175+
176+
// add Radius.Core environment resources to the result list
177+
if strings.HasPrefix(resourceTypeLower, environmentResourceType) {
178+
result.EnvironmentResources = append(result.EnvironmentResources, resource)
179+
}
172180
}
173181

174182
return result
@@ -182,3 +190,9 @@ func InspectTemplateResources(template map[string]any) TemplateInspectionResult
182190
func ContainsEnvironmentResource(template map[string]any) bool {
183191
return InspectTemplateResources(template).ContainsEnvironmentResource
184192
}
193+
194+
// GetEnvironmentResources inspects the compiled Radius Bicep template's resources and returns
195+
// all environment resources found as maps.
196+
func GetEnvironmentResources(template map[string]any) []map[string]any {
197+
return InspectTemplateResources(template).EnvironmentResources
198+
}

pkg/cli/clients/clients.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ type ApplicationsManagementClient interface {
203203
// ListEnvironmentsAll lists all environments across resource groups.
204204
ListEnvironmentsAll(ctx context.Context) ([]corerp.EnvironmentResource, error)
205205

206+
// ListRadiusCoreEnvironmentsAll lists all Radius.Core environments across resource groups.
207+
ListRadiusCoreEnvironmentsAll(ctx context.Context) ([]radiuscore.EnvironmentResource, error)
208+
206209
// ListRecipePacksInResourceGroup lists all recipe packs in the configured scope (assumes configured scope is a resource group).
207210
ListRecipePacksInResourceGroup(ctx context.Context) ([]radiuscore.RecipePackResource, error)
208211

pkg/cli/clients/management.go

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,19 @@ import (
3939
)
4040

4141
type UCPApplicationsManagementClient struct {
42-
RootScope string
43-
ClientOptions *arm.ClientOptions
44-
genericResourceClientFactory func(scope string, resourceType string) (genericResourceClient, error)
45-
applicationResourceClientFactory func(scope string) (applicationResourceClient, error)
46-
environmentResourceClientFactory func(scope string) (environmentResourceClient, error)
47-
recipePackResourceClientFactory func(scope string) (recipePackResourceClient, error)
48-
resourceGroupClientFactory func() (resourceGroupClient, error)
49-
resourceProviderClientFactory func() (resourceProviderClient, error)
50-
resourceTypeClientFactory func() (resourceTypeClient, error)
51-
apiVersionClientFactory func() (apiVersionClient, error)
52-
locationClientFactory func() (locationClient, error)
53-
capture func(ctx context.Context, capture **http.Response) context.Context
42+
RootScope string
43+
ClientOptions *arm.ClientOptions
44+
genericResourceClientFactory func(scope string, resourceType string) (genericResourceClient, error)
45+
applicationResourceClientFactory func(scope string) (applicationResourceClient, error)
46+
environmentResourceClientFactory func(scope string) (environmentResourceClient, error)
47+
recipePackResourceClientFactory func(scope string) (recipePackResourceClient, error)
48+
radiusCoreEnvironmentResourceClientFactory func(scope string) (radiusCoreEnvironmentResourceClient, error)
49+
resourceGroupClientFactory func() (resourceGroupClient, error)
50+
resourceProviderClientFactory func() (resourceProviderClient, error)
51+
resourceTypeClientFactory func() (resourceTypeClient, error)
52+
apiVersionClientFactory func() (apiVersionClient, error)
53+
locationClientFactory func() (locationClient, error)
54+
capture func(ctx context.Context, capture **http.Response) context.Context
5455
}
5556

5657
var _ ApplicationsManagementClient = (*UCPApplicationsManagementClient)(nil)
@@ -519,6 +520,46 @@ func (amc *UCPApplicationsManagementClient) ListEnvironmentsAll(ctx context.Cont
519520
return environments, nil
520521
}
521522

523+
// ListRadiusCoreEnvironmentsAll queries the plane scope for all Radius.Core environment resources
524+
// across all resource groups and returns them as a slice. It mirrors ListEnvironmentsAll, but
525+
// targets Radius.Core/environments (v20250801preview) instead of Applications.Core/environments
526+
// (v20231001preview).
527+
func (amc *UCPApplicationsManagementClient) ListRadiusCoreEnvironmentsAll(ctx context.Context) ([]corerpv20250801.EnvironmentResource, error) {
528+
scope, err := resources.ParseScope(amc.RootScope)
529+
if err != nil {
530+
return []corerpv20250801.EnvironmentResource{}, err
531+
}
532+
533+
// Query at plane scope, not resource group scope. We don't enforce the exact structure of the scope, so handle both cases.
534+
//
535+
// - /planes/radius/local
536+
// - /planes/radius/local/resourceGroups/my-group
537+
if scope.FindScope(resources_radius.ScopeResourceGroups) != "" {
538+
scope = scope.Truncate()
539+
}
540+
541+
// Generated client doesn't like the leading '/' in the scope.
542+
client, err := amc.createRadiusCoreEnvironmentClient(scope.String())
543+
if err != nil {
544+
return []corerpv20250801.EnvironmentResource{}, err
545+
}
546+
547+
environments := []corerpv20250801.EnvironmentResource{}
548+
pager := client.NewListByScopePager(&corerpv20250801.EnvironmentsClientListByScopeOptions{})
549+
for pager.More() {
550+
page, err := pager.NextPage(ctx)
551+
if err != nil {
552+
return []corerpv20250801.EnvironmentResource{}, err
553+
}
554+
555+
for _, environment := range page.EnvironmentResourceListResult.Value {
556+
environments = append(environments, *environment)
557+
}
558+
}
559+
560+
return environments, nil
561+
}
562+
522563
// GetEnvironment retrieves an environment by its name (in the configured scope) or resource ID.
523564
func (amc *UCPApplicationsManagementClient) GetEnvironment(ctx context.Context, environmentNameOrID string) (corerpv20231001.EnvironmentResource, error) {
524565
scope, name, err := amc.extractScopeAndName(environmentNameOrID)
@@ -1223,6 +1264,15 @@ func (amc *UCPApplicationsManagementClient) createEnvironmentClient(scope string
12231264
return amc.environmentResourceClientFactory(scope)
12241265
}
12251266

1267+
func (amc *UCPApplicationsManagementClient) createRadiusCoreEnvironmentClient(scope string) (radiusCoreEnvironmentResourceClient, error) {
1268+
if amc.radiusCoreEnvironmentResourceClientFactory == nil {
1269+
// Generated client doesn't like the leading '/' in the scope.
1270+
return corerpv20250801.NewEnvironmentsClient(strings.TrimPrefix(scope, resources.SegmentSeparator), &aztoken.AnonymousCredential{}, amc.ClientOptions)
1271+
}
1272+
1273+
return amc.radiusCoreEnvironmentResourceClientFactory(scope)
1274+
}
1275+
12261276
func (amc *UCPApplicationsManagementClient) createGenericClient(scope string, resourceType string, apiVersion ...string) (genericResourceClient, error) {
12271277
if amc.genericResourceClientFactory == nil {
12281278
clientOptions := *amc.ClientOptions

pkg/cli/clients/management_mocks.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import (
3535
// Because these interfaces are non-exported, they MUST be defined in their own file
3636
// and we MUST use -source on mockgen to generate mocks for them.
3737

38-
//go:generate mockgen -typed -source=./management_mocks.go -destination=./mock_management_wrapped_clients.go -package=clients -self_package github.com/radius-project/radius/pkg/cli/clients github.com/radius-project/radius/pkg/cli/clients genericResourceClient,applicationResourceClient,environmentResourceClient,resourceGroupClient,resourceProviderClient,resourceTypeClient,apiVersonClient,locationClient,recipePackResourceClient
38+
//go:generate mockgen -typed -source=./management_mocks.go -destination=./mock_management_wrapped_clients.go -package=clients -self_package github.com/radius-project/radius/pkg/cli/clients github.com/radius-project/radius/pkg/cli/clients genericResourceClient,applicationResourceClient,environmentResourceClient,resourceGroupClient,resourceProviderClient,resourceTypeClient,apiVersonClient,locationClient,recipePackResourceClient,radiusCoreEnvironmentResourceClient
3939

4040
// genericResourceClient is an interface for mocking the generated SDK client for any resource.
4141
type genericResourceClient interface {
@@ -106,3 +106,11 @@ type recipePackResourceClient interface {
106106
Get(ctx context.Context, recipePackName string, options *corerpv20250801.RecipePacksClientGetOptions) (corerpv20250801.RecipePacksClientGetResponse, error)
107107
NewListByScopePager(options *corerpv20250801.RecipePacksClientListByScopeOptions) *runtime.Pager[corerpv20250801.RecipePacksClientListByScopeResponse]
108108
}
109+
110+
// radiusCoreEnvironmentResourceClient is an interface for mocking the generated SDK client for Radius.Core/environments resources.
111+
type radiusCoreEnvironmentResourceClient interface {
112+
CreateOrUpdate(ctx context.Context, environmentName string, resource corerpv20250801.EnvironmentResource, options *corerpv20250801.EnvironmentsClientCreateOrUpdateOptions) (corerpv20250801.EnvironmentsClientCreateOrUpdateResponse, error)
113+
Delete(ctx context.Context, environmentName string, options *corerpv20250801.EnvironmentsClientDeleteOptions) (corerpv20250801.EnvironmentsClientDeleteResponse, error)
114+
Get(ctx context.Context, environmentName string, options *corerpv20250801.EnvironmentsClientGetOptions) (corerpv20250801.EnvironmentsClientGetResponse, error)
115+
NewListByScopePager(options *corerpv20250801.EnvironmentsClientListByScopeOptions) *runtime.Pager[corerpv20250801.EnvironmentsClientListByScopeResponse]
116+
}

pkg/cli/clients/management_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
v1 "github.com/radius-project/radius/pkg/armrpc/api/v1"
3030
"github.com/radius-project/radius/pkg/cli/clients_new/generated"
3131
corerp "github.com/radius-project/radius/pkg/corerp/api/v20231001preview"
32+
corerpv20250801 "github.com/radius-project/radius/pkg/corerp/api/v20250801preview"
3233
"github.com/radius-project/radius/pkg/to"
3334
ucp "github.com/radius-project/radius/pkg/ucp/api/v20231001preview"
3435
"github.com/stretchr/testify/require"
@@ -1362,6 +1363,75 @@ func Test_Environment(t *testing.T) {
13621363
})
13631364
}
13641365

1366+
func Test_RadiusCoreEnvironment(t *testing.T) {
1367+
t.Parallel()
1368+
createClient := func(wrapped radiusCoreEnvironmentResourceClient) *UCPApplicationsManagementClient {
1369+
return &UCPApplicationsManagementClient{
1370+
RootScope: testScope,
1371+
radiusCoreEnvironmentResourceClientFactory: func(scope string) (radiusCoreEnvironmentResourceClient, error) {
1372+
return wrapped, nil
1373+
},
1374+
capture: testCapture,
1375+
}
1376+
}
1377+
1378+
testResourceType := "Radius.Core/environments"
1379+
1380+
listPages := []corerpv20250801.EnvironmentsClientListByScopeResponse{
1381+
{
1382+
EnvironmentResourceListResult: corerpv20250801.EnvironmentResourceListResult{
1383+
Value: []*corerpv20250801.EnvironmentResource{
1384+
{
1385+
ID: to.Ptr(testScope + "/providers/" + testResourceType + "/" + "test1"),
1386+
Name: to.Ptr("test1"),
1387+
Type: &testResourceType,
1388+
Location: to.Ptr(v1.LocationGlobal),
1389+
},
1390+
{
1391+
ID: to.Ptr(testScope + "/providers/" + testResourceType + "/" + "test2"),
1392+
Name: to.Ptr("test2"),
1393+
Type: &testResourceType,
1394+
Location: to.Ptr(v1.LocationGlobal),
1395+
},
1396+
},
1397+
NextLink: to.Ptr("0"),
1398+
},
1399+
},
1400+
{
1401+
EnvironmentResourceListResult: corerpv20250801.EnvironmentResourceListResult{
1402+
Value: []*corerpv20250801.EnvironmentResource{
1403+
{
1404+
ID: to.Ptr(testScope + "/providers/" + testResourceType + "/" + "test3"),
1405+
Name: to.Ptr("test3"),
1406+
Type: &testResourceType,
1407+
Location: to.Ptr(v1.LocationGlobal),
1408+
},
1409+
},
1410+
NextLink: to.Ptr("1"),
1411+
},
1412+
},
1413+
}
1414+
1415+
t.Run("ListRadiusCoreEnvironmentsAll", func(t *testing.T) {
1416+
mock := NewMockradiusCoreEnvironmentResourceClient(gomock.NewController(t))
1417+
client := createClient(mock)
1418+
1419+
mock.EXPECT().
1420+
NewListByScopePager(gomock.Any()).
1421+
Return(pager(listPages))
1422+
1423+
expected := []corerpv20250801.EnvironmentResource{
1424+
*listPages[0].Value[0],
1425+
*listPages[0].Value[1],
1426+
*listPages[1].Value[0],
1427+
}
1428+
1429+
resources, err := client.ListRadiusCoreEnvironmentsAll(context.Background())
1430+
require.NoError(t, err)
1431+
require.Equal(t, expected, resources)
1432+
})
1433+
}
1434+
13651435
func Test_ResourceGroup(t *testing.T) {
13661436
t.Parallel()
13671437
createClient := func(wrapped resourceGroupClient) *UCPApplicationsManagementClient {

pkg/cli/clients/mock_applicationsclient.go

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)