Skip to content

Commit 0fb5d92

Browse files
fix(performance): code optimization
Added code optimization
1 parent 9557cf3 commit 0fb5d92

3 files changed

Lines changed: 27 additions & 39 deletions

File tree

pkg/cli/admin/upgrade/status/status.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ func New(f kcmdutil.Factory, streams genericiooptions.IOStreams) *cobra.Command
5555
Short: "Display the status of the current cluster version update or multi-arch migration",
5656
Run: func(cmd *cobra.Command, args []string) {
5757
kcmdutil.CheckErr(o.Complete(f, cmd, args))
58-
kcmdutil.CheckErr(o.Run(cmd.Context()))
58+
ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Minute)
59+
defer cancel()
60+
kcmdutil.CheckErr(o.Run(ctx))
5961
},
6062
}
6163

@@ -109,6 +111,7 @@ func (o *options) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []string
109111
return err
110112
}
111113
cfg.UserAgent = rest.DefaultKubernetesUserAgent() + "(upgrade-status)"
114+
cfg.Timeout = 60 * time.Second
112115

113116
roundTripper, err := rest.TransportFor(cfg)
114117
if err != nil {
@@ -230,23 +233,13 @@ func (o *options) Run(ctx context.Context) error {
230233
}
231234
var machineConfigs *machineconfigv1.MachineConfigList
232235
if machineConfigs = o.mockData.machineConfigs; machineConfigs == nil {
233-
machineConfigs = &machineconfigv1.MachineConfigList{}
234-
for _, node := range allNodes.Items {
235-
for _, key := range []string{mco.CurrentMachineConfigAnnotationKey, mco.DesiredMachineConfigAnnotationKey} {
236-
machineConfigName, ok := node.Annotations[key]
237-
if !ok || machineConfigName == "" {
238-
continue
239-
}
240-
mc, err := getMachineConfig(ctx, o.MachineConfigClient, machineConfigs.Items, machineConfigName)
241-
if err != nil {
242-
return err
243-
}
244-
if mc != nil {
245-
machineConfigs.Items = append(machineConfigs.Items, *mc)
246-
}
247-
}
236+
var err error
237+
machineConfigs, err = o.MachineConfigClient.MachineconfigurationV1().MachineConfigs().List(ctx, metav1.ListOptions{})
238+
if err != nil {
239+
return fmt.Errorf("listing MachineConfigs: %w", err)
248240
}
249241
}
242+
machineConfigVersionMap := buildMachineConfigVersionMap(machineConfigs.Items)
250243

251244
// The cluster stays within the same version number when it is migrated to multi-arch
252245
// and thus the comparison of version numbers in a normal cluster upgrade does not work.
@@ -298,7 +291,7 @@ func (o *options) Run(ctx context.Context) error {
298291
// but it cannot be opted out at the moment.
299292
multiArchMigrationInProgress := multiArchMigration(cv.Status.History) && progressing.Status == configv1.ConditionTrue
300293
for _, pool := range pools.Items {
301-
nodesStatusData, insights := assessNodesStatus(cv, pool, nodesPerPool[pool.Name], machineConfigs.Items, multiArchMigrationInProgress)
294+
nodesStatusData, insights := assessNodesStatus(cv, pool, nodesPerPool[pool.Name], machineConfigVersionMap, multiArchMigrationInProgress)
302295
updateInsights = append(updateInsights, insights...)
303296
poolStatus, insights := assessMachineConfigPool(pool, nodesStatusData)
304297
updateInsights = append(updateInsights, insights...)

pkg/cli/admin/upgrade/status/workerpool.go

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package status
22

33
import (
4-
"context"
54
"fmt"
65
"io"
76
"sort"
@@ -10,12 +9,10 @@ import (
109
"time"
1110

1211
corev1 "k8s.io/api/core/v1"
13-
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1412
"k8s.io/apimachinery/pkg/labels"
1513

1614
configv1 "github.com/openshift/api/config/v1"
1715
mcfgv1 "github.com/openshift/api/machineconfiguration/v1"
18-
mcfgv1client "github.com/openshift/client-go/machineconfiguration/clientset/versioned"
1916
"github.com/openshift/oc/pkg/cli/admin/upgrade/status/mco"
2017
)
2118

@@ -114,15 +111,6 @@ type poolDisplayData struct {
114111
Nodes []nodeDisplayData
115112
}
116113

117-
func getMachineConfig(ctx context.Context, client mcfgv1client.Interface, machineConfigs []mcfgv1.MachineConfig, machineConfigName string) (*mcfgv1.MachineConfig, error) {
118-
for _, mc := range machineConfigs {
119-
if mc.Name == machineConfigName {
120-
return nil, nil
121-
}
122-
}
123-
return client.MachineconfigurationV1().MachineConfigs().Get(ctx, machineConfigName, v1.GetOptions{})
124-
}
125-
126114
func whichPool(master, worker labels.Selector, custom map[string]labels.Selector, node corev1.Node) string {
127115
if master.Matches(labels.Set(node.Labels)) {
128116
return "master"
@@ -146,13 +134,13 @@ func ellipsizeNames(message string, name string) string {
146134
return strings.Replace(message, name, "<node>", -1)
147135
}
148136

149-
func assessNodesStatus(cv *configv1.ClusterVersion, pool mcfgv1.MachineConfigPool, nodes []corev1.Node, machineConfigs []mcfgv1.MachineConfig, multiArchMigrationInProgress bool) ([]nodeDisplayData, []updateInsight) {
137+
func assessNodesStatus(cv *configv1.ClusterVersion, pool mcfgv1.MachineConfigPool, nodes []corev1.Node, machineConfigVersionMap map[string]string, multiArchMigrationInProgress bool) ([]nodeDisplayData, []updateInsight) {
150138
var nodesStatusData []nodeDisplayData
151139
var insights []updateInsight
152140
for _, node := range nodes {
153141
desiredConfig, ok := node.Annotations[mco.DesiredMachineConfigAnnotationKey]
154-
currentVersion, foundCurrent := getOpenShiftVersionOfMachineConfig(machineConfigs, node.Annotations[mco.CurrentMachineConfigAnnotationKey])
155-
desiredVersion, foundDesired := getOpenShiftVersionOfMachineConfig(machineConfigs, desiredConfig)
142+
currentVersion, foundCurrent := getOpenShiftVersionOfMachineConfig(machineConfigVersionMap, node.Annotations[mco.CurrentMachineConfigAnnotationKey])
143+
desiredVersion, foundDesired := getOpenShiftVersionOfMachineConfig(machineConfigVersionMap, desiredConfig)
156144

157145
lns := mco.NewLayeredNodeState(&node)
158146
isUnavailable := lns.IsUnavailable(&pool)
@@ -245,14 +233,19 @@ func assessNodesStatus(cv *configv1.ClusterVersion, pool mcfgv1.MachineConfigPoo
245233
return nodesStatusData, insights
246234
}
247235

248-
func getOpenShiftVersionOfMachineConfig(machineConfigs []mcfgv1.MachineConfig, name string) (string, bool) {
236+
func buildMachineConfigVersionMap(machineConfigs []mcfgv1.MachineConfig) map[string]string {
237+
versionMap := make(map[string]string, len(machineConfigs))
249238
for _, mc := range machineConfigs {
250-
if mc.Name == name {
251-
openshiftVersion := mc.Annotations[mco.ReleaseImageVersionAnnotationKey]
252-
return openshiftVersion, openshiftVersion != ""
239+
if version := mc.Annotations[mco.ReleaseImageVersionAnnotationKey]; version != "" {
240+
versionMap[mc.Name] = version
253241
}
254242
}
255-
return "", false
243+
return versionMap
244+
}
245+
246+
func getOpenShiftVersionOfMachineConfig(versionMap map[string]string, name string) (string, bool) {
247+
version, found := versionMap[name]
248+
return version, found
256249
}
257250

258251
func isNodeDraining(node corev1.Node, isUpdating bool) bool {

pkg/cli/admin/upgrade/status/workerpool_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,8 @@ func Test_assessNodesStatus(t *testing.T) {
836836
}
837837
for _, tc := range testCases {
838838
t.Run(tc.name, func(t *testing.T) {
839-
nodeDisplayData, updateInsight := assessNodesStatus(tc.args.cv, tc.args.pool, tc.args.nodes, tc.args.machineConfigs, false)
839+
machineConfigVersionMap := buildMachineConfigVersionMap(tc.args.machineConfigs)
840+
nodeDisplayData, updateInsight := assessNodesStatus(tc.args.cv, tc.args.pool, tc.args.nodes, machineConfigVersionMap, false)
840841
if diff := cmp.Diff(tc.expectedNodeDisplayData, nodeDisplayData, allowUnexportedWorkerPools); diff != "" {
841842
t.Errorf("nodeDisplayData differ from expected:\n%s", diff)
842843
}
@@ -951,7 +952,8 @@ func Test_assessNodesStatus_DisplayData_Sorting(t *testing.T) {
951952
}
952953
for _, tc := range testCases {
953954
t.Run(tc.name, func(t *testing.T) {
954-
nodeDisplayData, _ := assessNodesStatus(tc.args.cv, tc.args.pool, tc.args.nodes, tc.args.machineConfigs, false)
955+
machineConfigVersionMap := buildMachineConfigVersionMap(tc.args.machineConfigs)
956+
nodeDisplayData, _ := assessNodesStatus(tc.args.cv, tc.args.pool, tc.args.nodes, machineConfigVersionMap, false)
955957
if diff := cmp.Diff(tc.expectedNodeDisplayData, nodeDisplayData, allowUnexportedWorkerPools); diff != "" {
956958
t.Errorf("nodeDisplayData differ from expected:\n%s", diff)
957959
}

0 commit comments

Comments
 (0)