Skip to content

Commit f9a5734

Browse files
authored
Merge pull request #54 from phoracek/ocp4_cni_compatibility
Support OpenShift 4
2 parents 439e9c9 + 175261e commit f9a5734

File tree

11 files changed

+83
-31
lines changed

11 files changed

+83
-31
lines changed

cluster/sync.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ for i in $(seq 1 ${CLUSTER_NUM_NODES}); do
1616
./cluster/cli.sh ssh "node$(printf "%02d" ${i})" 'sudo sysctl -w user.max_user_namespaces=1024'
1717
done
1818

19+
./cluster/kubectl.sh create -f _out/namespace.yaml
1920
./cluster/kubectl.sh create -f _out/crds/network-addons-config.crd.yaml
2021
./cluster/kubectl.sh create -f _out/operator.yaml
21-
./cluster/kubectl.sh create -f _out/namespace.yaml

data/linux-bridge/002-linux-bridge.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ spec:
5454
volumes:
5555
- name: cnibin
5656
hostPath:
57-
path: /opt/cni/bin
57+
path: {{ .CNIBinDir }}

data/multus/002-multus.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ spec:
6969
volumes:
7070
- name: cni
7171
hostPath:
72-
path: /etc/cni/net.d
72+
path: {{ .CNIConfigDir }}
7373
- name: cnibin
7474
hostPath:
75-
path: /opt/cni/bin
75+
path: {{ .CNIBinDir }}

data/sriov/002-sriov-cni.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,4 @@ spec:
4646
volumes:
4747
- name: cnibin
4848
hostPath:
49-
path: /opt/cni/bin
49+
path: {{ .CNIBinDir }}

pkg/controller/networkaddonsconfig/networkaddonsconfig_controller.go

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,39 @@ func Add(mgr manager.Manager) error {
5757
return fmt.Errorf("environment variable OPERATOR_NAMESPACE has to be set")
5858
}
5959

60-
sccIsAvailable, err := isSCCAvailable(clientset)
60+
clusterInfo := &network.ClusterInfo{}
61+
62+
openShift4, err := isRunningOnOpenShift4(clientset)
63+
if err != nil {
64+
return fmt.Errorf("failed to check whether running on OpenShift 4: %v", err)
65+
}
66+
if openShift4 {
67+
log.Printf("Running on OpenShift 4")
68+
}
69+
clusterInfo.OpenShift4 = openShift4
70+
71+
sccAvailable, err := isSCCAvailable(clientset)
6172
if err != nil {
6273
return fmt.Errorf("failed to check for availability of SCC: %v", err)
6374
}
75+
clusterInfo.SCCAvailable = sccAvailable
6476

65-
return add(mgr, newReconciler(mgr, namespace, sccIsAvailable))
77+
return add(mgr, newReconciler(mgr, namespace, clusterInfo))
6678
}
6779

6880
// newReconciler returns a new ReconcileNetworkAddonsConfig
69-
func newReconciler(mgr manager.Manager, namespace string, sccIsAvailable bool) *ReconcileNetworkAddonsConfig {
81+
func newReconciler(mgr manager.Manager, namespace string, clusterInfo *network.ClusterInfo) *ReconcileNetworkAddonsConfig {
7082
// Status manager is shared between both reconcilers and it is used to update conditions of
7183
// NetworkAddonsConfig.State. NetworkAddonsConfig reconciler updates it with progress of rendering
7284
// and applying of manifests. Pods reconciler updates it with progress of deployed pods.
7385
statusManager := statusmanager.New(mgr.GetClient(), names.OPERATOR_CONFIG)
7486
return &ReconcileNetworkAddonsConfig{
75-
client: mgr.GetClient(),
76-
scheme: mgr.GetScheme(),
77-
namespace: namespace,
78-
podReconciler: newPodReconciler(statusManager),
79-
statusManager: statusManager,
80-
sccIsAvailable: sccIsAvailable,
87+
client: mgr.GetClient(),
88+
scheme: mgr.GetScheme(),
89+
namespace: namespace,
90+
podReconciler: newPodReconciler(statusManager),
91+
statusManager: statusManager,
92+
clusterInfo: clusterInfo,
8193
}
8294
}
8395

@@ -138,12 +150,12 @@ var _ reconcile.Reconciler = &ReconcileNetworkAddonsConfig{}
138150
type ReconcileNetworkAddonsConfig struct {
139151
// This client, initialized using mgr.Client() above, is a split client
140152
// that reads objects from the cache and writes to the apiserver
141-
client client.Client
142-
scheme *runtime.Scheme
143-
namespace string
144-
podReconciler *ReconcilePods
145-
statusManager *statusmanager.StatusManager
146-
sccIsAvailable bool
153+
client client.Client
154+
scheme *runtime.Scheme
155+
namespace string
156+
podReconciler *ReconcilePods
157+
statusManager *statusmanager.StatusManager
158+
clusterInfo *network.ClusterInfo
147159
}
148160

149161
// Reconcile reads that state of the cluster for a NetworkAddonsConfig object and makes changes based on the state read
@@ -245,7 +257,7 @@ func (r *ReconcileNetworkAddonsConfig) renderObjects(networkAddonsConfig *opv1al
245257
}
246258

247259
// Generate the objects
248-
objs, err = network.Render(&networkAddonsConfig.Spec, ManifestPath, openshiftNetworkConfig, r.sccIsAvailable)
260+
objs, err = network.Render(&networkAddonsConfig.Spec, ManifestPath, openshiftNetworkConfig, r.clusterInfo)
249261
if err != nil {
250262
log.Printf("failed to render: %v", err)
251263
err = errors.Wrapf(err, "failed to render")
@@ -327,6 +339,12 @@ func getOpenShiftNetworkConfig(ctx context.Context, c k8sclient.Client) (*osv1.N
327339
return nc, nil
328340
}
329341

342+
// Check whether running on OpenShift 4 by looking for operator objects that has been introduced
343+
// only in OpenShift 4
344+
func isRunningOnOpenShift4(c kubernetes.Interface) (bool, error) {
345+
return isResourceAvailable(c, "configs", "imageregistry.operator.openshift.io", "v1")
346+
}
347+
330348
func isSCCAvailable(c kubernetes.Interface) (bool, error) {
331349
return isResourceAvailable(c, "securitycontextconstraints", "security.openshift.io", "v1")
332350
}

pkg/network/cluster-info.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package network
2+
3+
type ClusterInfo struct {
4+
SCCAvailable bool
5+
OpenShift4 bool
6+
}

pkg/network/cni/cni.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cni
2+
3+
const (
4+
ConfigDir = "/etc/cni/net.d"
5+
BinDir = "/opt/cni/bin"
6+
ConfigDirOpenShift4 = "/etc/kubernetes/cni/net.d"
7+
BinDirOpenShift4 = "/var/lib/cni/bin"
8+
)

pkg/network/linux-bridge.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1111

1212
opv1alpha1 "github.com/kubevirt/cluster-network-addons-operator/pkg/apis/networkaddonsoperator/v1alpha1"
13+
"github.com/kubevirt/cluster-network-addons-operator/pkg/network/cni"
1314
)
1415

1516
func changeSafeLinuxBridge(prev, next *opv1alpha1.NetworkAddonsConfigSpec) []error {
@@ -20,7 +21,7 @@ func changeSafeLinuxBridge(prev, next *opv1alpha1.NetworkAddonsConfigSpec) []err
2021
}
2122

2223
// renderLinuxBridge generates the manifests of Linux Bridge
23-
func renderLinuxBridge(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string, enableSCC bool) ([]*unstructured.Unstructured, error) {
24+
func renderLinuxBridge(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string, clusterInfo *ClusterInfo) ([]*unstructured.Unstructured, error) {
2425
if conf.LinuxBridge == nil {
2526
return nil, nil
2627
}
@@ -29,7 +30,12 @@ func renderLinuxBridge(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir str
2930
data := render.MakeRenderData()
3031
data.Data["LinuxBridgeImage"] = os.Getenv("LINUX_BRIDGE_IMAGE")
3132
data.Data["ImagePullPolicy"] = conf.ImagePullPolicy
32-
data.Data["EnableSCC"] = enableSCC
33+
if clusterInfo.OpenShift4 {
34+
data.Data["CNIBinDir"] = cni.BinDirOpenShift4
35+
} else {
36+
data.Data["CNIBinDir"] = cni.BinDir
37+
}
38+
data.Data["EnableSCC"] = clusterInfo.SCCAvailable
3339

3440
objs, err := render.RenderDir(filepath.Join(manifestDir, "linux-bridge"), &data)
3541
if err != nil {

pkg/network/multus.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1111

1212
opv1alpha1 "github.com/kubevirt/cluster-network-addons-operator/pkg/apis/networkaddonsoperator/v1alpha1"
13+
"github.com/kubevirt/cluster-network-addons-operator/pkg/network/cni"
1314
"github.com/kubevirt/cluster-network-addons-operator/pkg/render"
1415
)
1516

@@ -36,7 +37,7 @@ func changeSafeMultus(prev, next *opv1alpha1.NetworkAddonsConfigSpec) []error {
3637
}
3738

3839
// RenderMultus generates the manifests of Multus
39-
func renderMultus(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string, openshiftNetworkConfig *osv1.Network, enableSCC bool) ([]*unstructured.Unstructured, error) {
40+
func renderMultus(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string, openshiftNetworkConfig *osv1.Network, clusterInfo *ClusterInfo) ([]*unstructured.Unstructured, error) {
4041
if conf.Multus == nil || openshiftNetworkConfig != nil {
4142
return nil, nil
4243
}
@@ -45,7 +46,14 @@ func renderMultus(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string,
4546
data := render.MakeRenderData()
4647
data.Data["MultusImage"] = os.Getenv("MULTUS_IMAGE")
4748
data.Data["ImagePullPolicy"] = conf.ImagePullPolicy
48-
data.Data["EnableSCC"] = enableSCC
49+
if clusterInfo.OpenShift4 {
50+
data.Data["CNIConfigDir"] = cni.ConfigDirOpenShift4
51+
data.Data["CNIBinDir"] = cni.BinDirOpenShift4
52+
} else {
53+
data.Data["CNIConfigDir"] = cni.ConfigDir
54+
data.Data["CNIBinDir"] = cni.BinDir
55+
}
56+
data.Data["EnableSCC"] = clusterInfo.SCCAvailable
4957

5058
objs, err := render.RenderDir(filepath.Join(manifestDir, "multus"), &data)
5159
if err != nil {

pkg/network/network.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,26 @@ func IsChangeSafe(prev, next *opv1alpha1.NetworkAddonsConfigSpec) error {
6767
return nil
6868
}
6969

70-
func Render(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string, openshiftNetworkConfig *osv1.Network, enableSCC bool) ([]*unstructured.Unstructured, error) {
70+
func Render(conf *opv1alpha1.NetworkAddonsConfigSpec, manifestDir string, openshiftNetworkConfig *osv1.Network, clusterInfo *ClusterInfo) ([]*unstructured.Unstructured, error) {
7171
log.Print("starting render phase")
7272
objs := []*unstructured.Unstructured{}
7373

7474
// render Multus
75-
o, err := renderMultus(conf, manifestDir, openshiftNetworkConfig, enableSCC)
75+
o, err := renderMultus(conf, manifestDir, openshiftNetworkConfig, clusterInfo)
7676
if err != nil {
7777
return nil, err
7878
}
7979
objs = append(objs, o...)
8080

8181
// render Linux Bridge
82-
o, err = renderLinuxBridge(conf, manifestDir, enableSCC)
82+
o, err = renderLinuxBridge(conf, manifestDir, clusterInfo)
8383
if err != nil {
8484
return nil, err
8585
}
8686
objs = append(objs, o...)
8787

8888
// render SR-IOV
89-
o, err = renderSriov(conf, manifestDir, enableSCC)
89+
o, err = renderSriov(conf, manifestDir, clusterInfo)
9090
if err != nil {
9191
return nil, err
9292
}

0 commit comments

Comments
 (0)