diff --git a/pkg/util/cluster/aroclient.go b/pkg/util/cluster/aroclient.go new file mode 100644 index 00000000000..f6b85f2a3db --- /dev/null +++ b/pkg/util/cluster/aroclient.go @@ -0,0 +1,94 @@ +package cluster + +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache License 2.0. + +import ( + "context" + "encoding/json" + + "github.com/Azure/go-autorest/autorest" + "github.com/sirupsen/logrus" + + "github.com/Azure/ARO-RP/pkg/api" + v20230904 "github.com/Azure/ARO-RP/pkg/api/v20230904" + v20240812preview "github.com/Azure/ARO-RP/pkg/api/v20240812preview" + mgmtredhatopenshift20230904 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2023-09-04/redhatopenshift" + mgmtredhatopenshift20240812preview "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2024-08-12-preview/redhatopenshift" + "github.com/Azure/ARO-RP/pkg/env" + redhatopenshift20230904 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2023-09-04/redhatopenshift" + redhatopenshift20240812preview "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2024-08-12-preview/redhatopenshift" +) + +type InternalClient interface { + Get(ctx context.Context, resourceGroupName string, resourceName string) (*api.OpenShiftCluster, error) + CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, resourceName string, parameters *api.OpenShiftCluster) error + DeleteAndWait(ctx context.Context, resourceGroupName string, resourceName string) error +} + +type openShiftCluster interface { + mgmtredhatopenshift20230904.OpenShiftCluster | mgmtredhatopenshift20240812preview.OpenShiftCluster +} + +type externalClient[T openShiftCluster] interface { + Get(ctx context.Context, resourceGroupName string, resourceName string) (T, error) + CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, resourceName string, parameters T) error + DeleteAndWait(ctx context.Context, resourceGroupName string, resourceName string) error +} + +type internalClient[T openShiftCluster] struct { + externalClient externalClient[T] + converter api.OpenShiftClusterConverter + new func() T +} + +func NewInternalClient(log *logrus.Entry, environment env.Core, authorizer autorest.Authorizer) InternalClient { + if env.IsLocalDevelopmentMode() { + log.Infof("Using ARO API version [%s]", v20240812preview.APIVersion) + return &internalClient[mgmtredhatopenshift20240812preview.OpenShiftCluster]{ + externalClient: redhatopenshift20240812preview.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer), + converter: api.APIs[v20240812preview.APIVersion].OpenShiftClusterConverter, + new: func() mgmtredhatopenshift20240812preview.OpenShiftCluster { + return mgmtredhatopenshift20240812preview.OpenShiftCluster{} + }, + } + } + + log.Infof("Using ARO API version [%s]", v20230904.APIVersion) + return &internalClient[mgmtredhatopenshift20230904.OpenShiftCluster]{ + externalClient: redhatopenshift20230904.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer), + converter: api.APIs[v20230904.APIVersion].OpenShiftClusterConverter, + new: func() mgmtredhatopenshift20230904.OpenShiftCluster { + return mgmtredhatopenshift20230904.OpenShiftCluster{} + }, + } +} + +func (c *internalClient[T]) Get(ctx context.Context, resourceGroupName string, resourceName string) (*api.OpenShiftCluster, error) { + oc := &api.OpenShiftCluster{} + ext, err := c.externalClient.Get(ctx, resourceGroupName, resourceName) + if err != nil { + return oc, err + } + c.converter.ToInternal(ext, oc) + return oc, nil +} + +func (c *internalClient[T]) CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, resourceName string, parameters *api.OpenShiftCluster) error { + ext := c.converter.ToExternal(parameters) + data, err := json.Marshal(ext) + if err != nil { + return err + } + + ocExt := c.new() + if err = json.Unmarshal(data, &ocExt); err != nil { + return err + } + + return c.externalClient.CreateOrUpdateAndWait(ctx, resourceGroupName, resourceName, ocExt) +} + +func (c *internalClient[T]) DeleteAndWait(ctx context.Context, resourceGroupName string, resourceName string) error { + return c.externalClient.DeleteAndWait(ctx, resourceGroupName, resourceName) +} diff --git a/pkg/util/cluster/cluster.go b/pkg/util/cluster/cluster.go index b71b546407c..bcecd234807 100644 --- a/pkg/util/cluster/cluster.go +++ b/pkg/util/cluster/cluster.go @@ -31,8 +31,6 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "github.com/Azure/ARO-RP/pkg/api" - v20230904 "github.com/Azure/ARO-RP/pkg/api/v20230904" - mgmtredhatopenshift20230904 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2023-09-04/redhatopenshift" "github.com/Azure/ARO-RP/pkg/deploy/assets" "github.com/Azure/ARO-RP/pkg/deploy/generator" "github.com/Azure/ARO-RP/pkg/env" @@ -41,7 +39,6 @@ import ( "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/authorization" "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features" "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/network" - redhatopenshift20230904 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2023-09-04/redhatopenshift" utilgraph "github.com/Azure/ARO-RP/pkg/util/graph" "github.com/Azure/ARO-RP/pkg/util/rbac" "github.com/Azure/ARO-RP/pkg/util/uuid" @@ -57,7 +54,7 @@ type Cluster struct { spGraphClient *utilgraph.GraphServiceClient deployments features.DeploymentsClient groups features.ResourceGroupsClient - openshiftclusters redhatopenshift20230904.OpenShiftClustersClient + openshiftclusters InternalClient securitygroups network.SecurityGroupsClient subnets network.SubnetsClient routetables network.RouteTablesClient @@ -108,7 +105,7 @@ func New(log *logrus.Entry, environment env.Core, ci bool) (*Cluster, error) { spGraphClient: spGraphClient, deployments: features.NewDeploymentsClient(environment.Environment(), environment.SubscriptionID(), authorizer), groups: features.NewResourceGroupsClient(environment.Environment(), environment.SubscriptionID(), authorizer), - openshiftclusters: redhatopenshift20230904.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer), + openshiftclusters: NewInternalClient(log, environment, authorizer), securitygroups: network.NewSecurityGroupsClient(environment.Environment(), environment.SubscriptionID(), authorizer), subnets: network.NewSubnetsClient(environment.Environment(), environment.SubscriptionID(), authorizer), routetables: network.NewRouteTablesClient(environment.Environment(), environment.SubscriptionID(), authorizer), @@ -162,7 +159,7 @@ func (c *Cluster) DeleteApp(ctx context.Context) error { func (c *Cluster) Create(ctx context.Context, vnetResourceGroup, clusterName string, osClusterVersion string) error { clusterGet, err := c.openshiftclusters.Get(ctx, vnetResourceGroup, clusterName) if err == nil { - if clusterGet.ProvisioningState == mgmtredhatopenshift20230904.Failed { + if clusterGet.Properties.ProvisioningState == api.ProvisioningStateFailed { return fmt.Errorf("cluster exists and is in failed provisioning state, please delete and retry") } c.log.Print("cluster already exists, skipping create") @@ -469,19 +466,7 @@ func (c *Cluster) createCluster(ctx context.Context, vnetResourceGroup, clusterN oc.Properties.WorkerProfiles[0].VMSize = api.VMSizeStandardD2sV3 } - ext := api.APIs[v20230904.APIVersion].OpenShiftClusterConverter.ToExternal(&oc) - data, err := json.Marshal(ext) - if err != nil { - return err - } - - ocExt := mgmtredhatopenshift20230904.OpenShiftCluster{} - err = json.Unmarshal(data, &ocExt) - if err != nil { - return err - } - - return c.openshiftclusters.CreateOrUpdateAndWait(ctx, vnetResourceGroup, clusterName, ocExt) + return c.openshiftclusters.CreateOrUpdateAndWait(ctx, vnetResourceGroup, clusterName, &oc) } func (c *Cluster) registerSubscription(ctx context.Context) error { @@ -604,7 +589,7 @@ func (c *Cluster) deleteRoleAssignments(ctx context.Context, vnetResourceGroup, if err != nil { return fmt.Errorf("error getting cluster document: %w", err) } - spObjID, err := utilgraph.GetServicePrincipalIDByAppID(ctx, c.spGraphClient, *oc.OpenShiftClusterProperties.ServicePrincipalProfile.ClientID) + spObjID, err := utilgraph.GetServicePrincipalIDByAppID(ctx, c.spGraphClient, oc.Properties.ServicePrincipalProfile.ClientID) if err != nil { return fmt.Errorf("error getting service principal for cluster: %w", err) }