-
Notifications
You must be signed in to change notification settings - Fork 233
/
helper.go
91 lines (71 loc) · 3.03 KB
/
helper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
Copyright 2022 The KubeOne 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 operatingsystemmanager
import (
"context"
"time"
"k8c.io/kubeone/pkg/clientutil"
"k8c.io/kubeone/pkg/fail"
"k8c.io/kubeone/pkg/state"
"k8c.io/kubeone/pkg/templates/resources"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/wait"
dynclient "sigs.k8s.io/controller-runtime/pkg/client"
)
const appLabelKey = "app"
// WaitReady waits for operating-system-manager and its webhook to become ready
func WaitReady(s *state.State) error {
if !s.Cluster.OperatingSystemManager.Deploy {
return nil
}
s.Logger.Infoln("Waiting for operating-system-manager to come up...")
if err := waitForWebhook(s.Context, s.DynamicClient); err != nil {
return err
}
if err := waitForController(s.Context, s.DynamicClient); err != nil {
return err
}
return waitForCRDs(s)
}
// waitForCRDs waits for operating-system-manager CRDs to be created and become established
func waitForCRDs(s *state.State) error {
condFn := clientutil.CRDsReadyCondition(s.Context, s.DynamicClient, CRDNames())
err := wait.PollUntilContextTimeout(s.Context, 5*time.Second, 3*time.Minute, false, condFn.WithContext())
return fail.KubeClient(err, "waiting for OSM CRDs to became ready")
}
// waitForController waits for operating-system-manager controller to become running
func waitForController(ctx context.Context, client dynclient.Client) error {
condFn := clientutil.PodsReadyCondition(ctx, client, dynclient.ListOptions{
Namespace: resources.OperatingSystemManagerNamespace,
LabelSelector: labels.SelectorFromSet(map[string]string{
appLabelKey: resources.OperatingSystemManagerName,
}),
})
return fail.KubeClient(wait.PollUntilContextTimeout(ctx, 5*time.Second, 3*time.Minute, false, condFn.WithContext()), "waiting for OSM controller to became ready")
}
// waitForWebhook waits for operating-system-manager-webhook to become running
func waitForWebhook(ctx context.Context, client dynclient.Client) error {
condFn := clientutil.PodsReadyCondition(ctx, client, dynclient.ListOptions{
Namespace: resources.OperatingSystemManagerNamespace,
LabelSelector: labels.SelectorFromSet(map[string]string{
appLabelKey: resources.OperatingSystemManagerWebhookName,
}),
})
return fail.KubeClient(wait.PollUntilContextTimeout(ctx, 5*time.Second, 3*time.Minute, false, condFn.WithContext()), "waiting for OSM webhook to became ready")
}
func CRDNames() []string {
return []string{
"operatingsystemprofiles.operatingsystemmanager.k8c.io",
"operatingsystemconfigs.operatingsystemmanager.k8c.io",
}
}