Skip to content

Commit 4e87ffc

Browse files
Merge pull request #899 from sjenning/revert-867-IR-373
TRT-1193: Revert "IR-373: remove node-ca daemon"
2 parents a665b43 + bc8b80c commit 4e87ffc

File tree

11 files changed

+573
-23
lines changed

11 files changed

+573
-23
lines changed

bindata/assets.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package assets
2+
3+
import (
4+
"embed"
5+
)
6+
7+
//go:embed *.yaml
8+
var f embed.FS
9+
10+
// MustAsset reads and returns the content of the named file or panics
11+
// if something went wrong.
12+
func MustAsset(name string) []byte {
13+
data, err := f.ReadFile(name)
14+
if err != nil {
15+
panic(err)
16+
}
17+
18+
return data
19+
}

bindata/nodecadaemon.yaml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
apiVersion: apps/v1
2+
kind: DaemonSet
3+
metadata:
4+
name: node-ca
5+
namespace: openshift-image-registry
6+
spec:
7+
selector:
8+
matchLabels:
9+
name: node-ca
10+
updateStrategy:
11+
type: RollingUpdate
12+
rollingUpdate:
13+
maxUnavailable: 10%
14+
template:
15+
metadata:
16+
annotations:
17+
target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}'
18+
labels:
19+
name: node-ca
20+
spec:
21+
nodeSelector:
22+
kubernetes.io/os: linux
23+
priorityClassName: system-cluster-critical
24+
tolerations:
25+
- operator: Exists
26+
hostNetwork: true # run as host network to tolerate unready networks
27+
serviceAccountName: node-ca
28+
containers:
29+
- name: node-ca
30+
securityContext:
31+
privileged: true
32+
runAsUser: 1001
33+
runAsGroup: 0
34+
image: docker.io/openshift/origin-cluster-image-registry-operator:latest
35+
resources:
36+
requests:
37+
cpu: 10m
38+
memory: 10Mi
39+
command:
40+
- "/bin/sh"
41+
- "-c"
42+
- |
43+
trap 'jobs -p | xargs -r kill; echo shutting down node-ca; exit 0' TERM
44+
while [ true ];
45+
do
46+
for f in $(ls /tmp/serviceca); do
47+
echo $f
48+
ca_file_path="/tmp/serviceca/${f}"
49+
f=$(echo $f | sed -r 's/(.*)\.\./\1:/')
50+
reg_dir_path="/etc/docker/certs.d/${f}"
51+
if [ -e "${reg_dir_path}" ]; then
52+
cp -u $ca_file_path $reg_dir_path/ca.crt
53+
else
54+
mkdir $reg_dir_path
55+
cp $ca_file_path $reg_dir_path/ca.crt
56+
fi
57+
done
58+
for d in $(ls /etc/docker/certs.d); do
59+
echo $d
60+
dp=$(echo $d | sed -r 's/(.*):/\1\.\./')
61+
reg_conf_path="/tmp/serviceca/${dp}"
62+
if [ ! -e "${reg_conf_path}" ]; then
63+
rm -rf /etc/docker/certs.d/$d
64+
fi
65+
done
66+
sleep 60 & wait ${!}
67+
done
68+
volumeMounts:
69+
- name: serviceca
70+
mountPath: /tmp/serviceca
71+
- name: host
72+
mountPath: /etc/docker/certs.d
73+
volumes:
74+
- name: host
75+
hostPath:
76+
path: /etc/docker/certs.d
77+
- name: serviceca
78+
configMap:
79+
name: image-registry-certificates

pkg/operator/nodecadaemon.go

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import (
55
"fmt"
66
"time"
77

8+
appsv1 "k8s.io/api/apps/v1"
89
"k8s.io/apimachinery/pkg/api/errors"
9-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
utilerrors "k8s.io/apimachinery/pkg/util/errors"
1011
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1112
"k8s.io/apimachinery/pkg/util/wait"
1213
appsv1informers "k8s.io/client-go/informers/apps/v1"
@@ -121,38 +122,65 @@ func (c *NodeCADaemonController) sync() error {
121122
Status: operatorv1.ConditionUnknown,
122123
}
123124

124-
_, err := gen.Get()
125+
dsObj, err := gen.Get()
125126
if errors.IsNotFound(err) {
126-
availableCondition.Status = operatorv1.ConditionTrue
127-
availableCondition.Reason = "AsExpected"
128-
availableCondition.Message = "The daemon set node-ca is removed"
127+
availableCondition.Status = operatorv1.ConditionFalse
128+
availableCondition.Reason = "NotFound"
129+
availableCondition.Message = "The daemon set node-ca does not exist"
129130

130-
progressingCondition.Status = operatorv1.ConditionFalse
131-
progressingCondition.Reason = "AsExpected"
132-
progressingCondition.Message = "The daemon set node-ca is removed"
131+
progressingCondition.Status = operatorv1.ConditionTrue
132+
progressingCondition.Reason = "NotFound"
133+
progressingCondition.Message = "The daemon set node-ca does not exist"
133134
} else if err != nil {
134135
availableCondition.Reason = "Unknown"
135-
availableCondition.Message = fmt.Sprintf("Unable to check daemon set existence: %s", err)
136+
availableCondition.Message = fmt.Sprintf("Unable to check daemon set availability: %s", err)
136137

137138
progressingCondition.Reason = "Unknown"
138-
progressingCondition.Message = fmt.Sprintf("Unable to check daemon set existence: %s", err)
139+
progressingCondition.Message = fmt.Sprintf("Unable to check daemon set progress: %s", err)
139140
} else {
140-
gracePeriod := int64(0)
141-
propagationPolicy := metav1.DeletePropagationForeground
142-
opts := metav1.DeleteOptions{
143-
GracePeriodSeconds: &gracePeriod,
144-
PropagationPolicy: &propagationPolicy,
141+
ds := dsObj.(*appsv1.DaemonSet)
142+
if ds.Status.NumberAvailable > 0 {
143+
availableCondition.Status = operatorv1.ConditionTrue
144+
availableCondition.Reason = "AsExpected"
145+
availableCondition.Message = "The daemon set node-ca has available replicas"
146+
} else {
147+
availableCondition.Status = operatorv1.ConditionFalse
148+
availableCondition.Reason = "NoAvailableReplicas"
149+
availableCondition.Message = "The daemon set node-ca does not have available replicas"
145150
}
146-
err := gen.Delete(opts)
147-
if err != nil && !errors.IsNotFound(err) {
148-
availableCondition.Reason = "Unknown"
149-
availableCondition.Message = fmt.Sprintf("Unable to delete daemon set: %s", err)
150151

151-
progressingCondition.Reason = "Unknown"
152-
progressingCondition.Message = fmt.Sprintf("Unable to delete daemon set: %s", err)
152+
if ds.Generation != ds.Status.ObservedGeneration {
153+
progressingCondition.Status = operatorv1.ConditionTrue
154+
progressingCondition.Reason = "Progressing"
155+
progressingCondition.Message = "The daemon set node-ca is updating node pods"
156+
} else if ds.Status.NumberUnavailable > 0 {
157+
progressingCondition.Status = operatorv1.ConditionTrue
158+
progressingCondition.Reason = "Unavailable"
159+
progressingCondition.Message = "The daemon set node-ca is deploying node pods"
160+
} else {
161+
progressingCondition.Status = operatorv1.ConditionFalse
162+
progressingCondition.Reason = "AsExpected"
163+
progressingCondition.Message = "The daemon set node-ca is deployed"
153164
}
154165
}
155166

167+
err = resource.ApplyMutator(gen)
168+
if err != nil {
169+
_, _, updateError := v1helpers.UpdateStatus(
170+
ctx,
171+
c.operatorClient,
172+
v1helpers.UpdateConditionFn(availableCondition),
173+
v1helpers.UpdateConditionFn(progressingCondition),
174+
v1helpers.UpdateConditionFn(operatorv1.OperatorCondition{
175+
Type: "NodeCADaemonControllerDegraded",
176+
Status: operatorv1.ConditionTrue,
177+
Reason: "Error",
178+
Message: err.Error(),
179+
}),
180+
)
181+
return utilerrors.NewAggregate([]error{err, updateError})
182+
}
183+
156184
_, _, err = v1helpers.UpdateStatus(
157185
ctx,
158186
c.operatorClient,

pkg/resource/nodecadaemon.go

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package resource
22

33
import (
44
"context"
5+
"os"
56

67
appsv1 "k8s.io/api/apps/v1"
78
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -10,9 +11,14 @@ import (
1011
appsv1listers "k8s.io/client-go/listers/apps/v1"
1112
corev1listers "k8s.io/client-go/listers/core/v1"
1213

14+
operatorv1 "github.com/openshift/api/operator/v1"
1315
"github.com/openshift/library-go/pkg/operator/events"
16+
"github.com/openshift/library-go/pkg/operator/resource/resourceapply"
17+
"github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
18+
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
1419
"github.com/openshift/library-go/pkg/operator/v1helpers"
1520

21+
assets "github.com/openshift/cluster-image-registry-operator/bindata"
1622
"github.com/openshift/cluster-image-registry-operator/pkg/defaults"
1723
)
1824

@@ -52,12 +58,52 @@ func (ds *generatorNodeCADaemonSet) Get() (runtime.Object, error) {
5258
return ds.daemonSetLister.Get(ds.GetName())
5359
}
5460

61+
func (ds *generatorNodeCADaemonSet) expected() *appsv1.DaemonSet {
62+
daemonSet := resourceread.ReadDaemonSetV1OrDie(assets.MustAsset("nodecadaemon.yaml"))
63+
daemonSet.Spec.Template.Spec.Containers[0].Image = os.Getenv("IMAGE")
64+
return daemonSet
65+
}
66+
5567
func (ds *generatorNodeCADaemonSet) Create() (runtime.Object, error) {
56-
return nil, nil
68+
dep, _, err := ds.Update(nil)
69+
return dep, err
5770
}
5871

5972
func (ds *generatorNodeCADaemonSet) Update(o runtime.Object) (runtime.Object, bool, error) {
60-
return nil, false, nil
73+
desiredDaemonSet := ds.expected()
74+
75+
_, opStatus, _, err := ds.operatorClient.GetOperatorState()
76+
if err != nil {
77+
return nil, false, err
78+
}
79+
actualDaemonSet, updated, err := resourceapply.ApplyDaemonSet(
80+
context.TODO(),
81+
ds.client,
82+
ds.eventRecorder,
83+
desiredDaemonSet,
84+
resourcemerge.ExpectedDaemonSetGeneration(desiredDaemonSet, opStatus.Generations),
85+
)
86+
if err != nil {
87+
return o, updated, err
88+
}
89+
90+
if updated {
91+
updateStatusFn := func(newStatus *operatorv1.OperatorStatus) error {
92+
resourcemerge.SetDaemonSetGeneration(&newStatus.Generations, actualDaemonSet)
93+
return nil
94+
}
95+
96+
_, _, err = v1helpers.UpdateStatus(
97+
context.TODO(),
98+
ds.operatorClient,
99+
updateStatusFn,
100+
)
101+
if err != nil {
102+
return actualDaemonSet, updated, err
103+
}
104+
}
105+
106+
return actualDaemonSet, updated, nil
61107
}
62108

63109
func (ds *generatorNodeCADaemonSet) Delete(opts metav1.DeleteOptions) error {

pkg/resource/nodecadaemon_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package resource
2+
3+
import (
4+
"context"
5+
"testing"
6+
"time"
7+
8+
appsv1 "k8s.io/api/apps/v1"
9+
corev1 "k8s.io/api/core/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
kfake "k8s.io/client-go/kubernetes/fake"
13+
14+
imageregistryv1 "github.com/openshift/api/imageregistry/v1"
15+
imageregistryfake "github.com/openshift/client-go/imageregistry/clientset/versioned/fake"
16+
imageregistryinformers "github.com/openshift/client-go/imageregistry/informers/externalversions"
17+
"github.com/openshift/library-go/pkg/operator/events"
18+
19+
"github.com/openshift/cluster-image-registry-operator/pkg/client"
20+
)
21+
22+
func findToleration(list []corev1.Toleration, cond func(toleration corev1.Toleration) bool) *corev1.Toleration {
23+
for i, t := range list {
24+
if cond(t) {
25+
return &list[i]
26+
}
27+
}
28+
return nil
29+
}
30+
31+
func TestNodeCADaemon(t *testing.T) {
32+
ctx, cancel := context.WithCancel(context.Background())
33+
defer cancel()
34+
35+
imageregistryObjects := []runtime.Object{
36+
&imageregistryv1.Config{
37+
ObjectMeta: metav1.ObjectMeta{
38+
Name: "cluster",
39+
},
40+
},
41+
}
42+
43+
clientset := kfake.NewSimpleClientset()
44+
imageregistryClient := imageregistryfake.NewSimpleClientset(imageregistryObjects...)
45+
46+
imageregistryInformers := imageregistryinformers.NewSharedInformerFactory(imageregistryClient, time.Minute)
47+
48+
operatorClient := client.NewConfigOperatorClient(
49+
imageregistryClient.ImageregistryV1().Configs(),
50+
imageregistryInformers.Imageregistry().V1().Configs(),
51+
)
52+
53+
imageregistryInformers.Start(ctx.Done())
54+
imageregistryInformers.WaitForCacheSync(ctx.Done())
55+
56+
g := NewGeneratorNodeCADaemonSet(events.NewInMemoryRecorder("image-registry-operator"), nil, nil, clientset.AppsV1(), operatorClient)
57+
obj, err := g.Create()
58+
if err != nil {
59+
t.Fatal(err)
60+
}
61+
62+
ds := obj.(*appsv1.DaemonSet)
63+
noScheduleToleration := findToleration(ds.Spec.Template.Spec.Tolerations, func(tol corev1.Toleration) bool {
64+
return tol.Key == "" && tol.Operator == "Exists" && tol.Value == "" && tol.Effect == ""
65+
})
66+
if noScheduleToleration == nil {
67+
t.Errorf("unable to find toleration for all taints, %#+v", ds.Spec.Template.Spec.Tolerations)
68+
}
69+
}

test/e2e/aws_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func TestAWSDefaults(t *testing.T) {
7878
framework.EnsureClusterOperatorStatusIsNormal(te)
7979
framework.EnsureOperatorIsNotHotLooping(te)
8080
framework.EnsureServiceCAConfigMap(te)
81+
framework.EnsureNodeCADaemonSetIsAvailable(te)
8182

8283
s3Driver := storages3.NewDriver(context.Background(), nil, &mockLister.StorageListers)
8384
err = s3Driver.UpdateEffectiveConfig()

0 commit comments

Comments
 (0)