Skip to content

Commit

Permalink
Support hyperconverged cluster operator via OLM
Browse files Browse the repository at this point in the history
  • Loading branch information
Stephan Feurer authored and Debakel Orakel committed Feb 23, 2024
1 parent ae645bd commit e373f37
Show file tree
Hide file tree
Showing 36 changed files with 340 additions and 133 deletions.
39 changes: 19 additions & 20 deletions class/defaults.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@ parameters:
=_metadata: {}

operators:
hyperconverged:
enabled: false
channel: stable
namespace:
annotations: {}
labels: {}
resources: {}

kubevirt:
enabled: true
version: v1.1.1
Expand All @@ -24,28 +32,19 @@ parameters:
name: syn-kubevirt-cdi
replicas: 1

network: {}
hostpath: {}
quota: {}
scale: {}

config:
kubevirt:
certificateRotateStrategy: {}
configuration: {}
customizeComponents: {}
imagePullPolicy: IfNotPresent
workloadUpdateStrategy: {}
kubevirt: {}
importer: {}
network: {}
hostpath: {}
quota: {}
scale: {}

importer:
config:
featureGates:
- HonorWaitForFirstConsumer
imagePullPolicy: IfNotPresent
infra:
nodeSelector:
kubernetes.io/os: linux
tolerations:
- key: CriticalAddonsOnly
operator: Exists
workload:
nodeSelector:
kubernetes.io/os: linux

cluster:
types: {}
Expand Down
10 changes: 7 additions & 3 deletions class/kubevirt-operator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ parameters:
- input_paths:
- ${_base_directory}/component/importer.jsonnet
input_type: jsonnet
output_path: kubevirt-operator/importer/
output_path: kubevirt-operator/
- input_paths:
- ${_base_directory}/component/kubevirt.jsonnet
input_type: jsonnet
output_path: kubevirt-operator/kubevirt/
output_path: kubevirt-operator/
- input_paths:
- ${_base_directory}/component/kubevirt_types.jsonnet
input_type: jsonnet
output_path: kubevirt-operator/kubevirt/
output_path: kubevirt-operator/
- input_paths:
- ${_base_directory}/component/hyper.jsonnet
input_type: jsonnet
output_path: kubevirt-operator/
11 changes: 5 additions & 6 deletions component/app.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@ local kap = import 'lib/kapitan.libjsonnet';
local inv = kap.inventory();
local params = inv.parameters.kubevirt_operator;
local argocd = import 'lib/argocd.libjsonnet';
local helper = import 'helper.libsonnet';

local app = argocd.App('kubevirt-operator', params.kubevirt.namespace.name);
local hasKubevirt = params.operators.kubevirt.enabled;
local hasImporter = params.operators.importer.enabled;

{
[if hasKubevirt then 'kubevirt-operator']: app {
[if helper.isEnabled('kubevirt') then 'kubevirt-operator']: app {
spec+: {
source: {
path: 'manifests/kubevirt-operator/kubevirt',
path: 'manifests/kubevirt-operator/10_kubevirt',
},
syncPolicy+: {
syncOptions+: [
Expand All @@ -20,10 +19,10 @@ local hasImporter = params.operators.importer.enabled;
},
},
},
[if hasImporter then 'kubevirt-cdi']: app {
[if helper.isEnabled('importer') then 'kubevirt-cdi']: app {
spec+: {
source: {
path: 'manifests/kubevirt-operator/importer',
path: 'manifests/kubevirt-operator/20_importer',
},
syncPolicy+: {
syncOptions+: [
Expand Down
12 changes: 12 additions & 0 deletions component/helper.libsonnet
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
local kap = import 'lib/kapitan.libjsonnet';
local inv = kap.inventory();
local params = inv.parameters.kubevirt_operator;

// Loading and patching manifests
local clusterScoped = [
'ClusterRole',
'ClusterRoleBinding',
Expand Down Expand Up @@ -35,6 +38,15 @@ local patchManifests(path, namespace) = std.map(
manifests('kubevirt-operator/manifests/' + path)
);

// Component
local componentEnabled(component) =
if component == 'hyperconverged' then
params.operators.hyperconverged.enabled
else
std.get(params.operators, component, { enabled: false }).enabled
&& !params.operators.hyperconverged.enabled;

{
load: patchManifests,
isEnabled: componentEnabled,
}
77 changes: 77 additions & 0 deletions component/hyper.jsonnet
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// main template for kubevirt-operator
local com = import 'lib/commodore.libjsonnet';
local kap = import 'lib/kapitan.libjsonnet';
local kube = import 'lib/kube.libjsonnet';
local olm = import 'lib/olm.libsonnet';

local helper = import 'helper.libsonnet';

// The hiera parameters for the component
local inv = kap.inventory();
local operator = inv.parameters.kubevirt_operator.operators.hyperconverged;
local params = inv.parameters.kubevirt_operator.config;
local isOpenshift = std.startsWith(inv.parameters.facts.distribution, 'openshift');

// Namespace
local namespace = kube.Namespace('kubevirt-hyperconverged') {
metadata+: {
annotations+: operator.namespace.annotations,
labels+: {
// Configure the namespaces so that the OCP4 cluster-monitoring
// Prometheus can find the servicemonitors and rules.
[if isOpenshift then 'openshift.io/cluster-monitoring']: 'true',
} + com.makeMergeable(operator.namespace.labels),
},
};

// OLM
local packageName = if isOpenshift then 'kubevirt-hyperconverged' else 'community-kubevirt-hyperconverged';
local catalog = if isOpenshift then 'redhat-operators' else 'operatorhubio-catalog';

local operatorGroup = olm.OperatorGroup('kubevirt-operators') {
metadata+: {
namespace: 'kubevirt-hyperconverged',
},
};

local subscription = olm.namespacedSubscription(
'kubevirt-hyperconverged',
packageName,
operator.channel,
catalog,
) {
spec+: {
config+: {
resources: operator.resources,
},
},
};

// Instance
local config = com.makeMergeable(params.scale)
+ com.makeMergeable(params.quota)
+ com.makeMergeable(params.hostpath)
+ com.makeMergeable(params.network)
+ com.makeMergeable(params.importer)
+ com.makeMergeable(params.kubevirt);

local instance = kube._Object('hco.kubevirt.io/v1beta1', 'HyperConverged', 'instance') {
metadata+: {
labels: {
'app.kubernetes.io/managed-by': 'commodore',
'app.kubernetes.io/name': 'instance',
'app.kubernetes.io/instance': 'instance',
},
namespace: 'kubevirt-hyperconverged',
},
spec: config,
};


// Define outputs below
if helper.isEnabled('hyperconverged') then {
'00_namespace': namespace,
'10_operator_group': operatorGroup,
'10_subscription': subscription,
[if std.length(config) > 0 then '20_instance']: instance,
} else {}
23 changes: 5 additions & 18 deletions component/importer.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,6 @@ local namespace = kube.Namespace(operator.namespace.name) {
},
};

// Namespace
local namespace = kube.Namespace(operator.namespace.name) {
metadata+: {
annotations+: operator.namespace.annotations,
labels+: {
// Configure the namespaces so that the OCP4 cluster-monitoring
// Prometheus can find the servicemonitors and rules.
[if isOpenshift then 'openshift.io/cluster-monitoring']: 'true',
} + com.makeMergeable(operator.namespace.labels),
},
};

// Instance
local instance = kube._Object('cdi.kubevirt.io/v1beta1', 'CDI', 'instance') {
metadata+: {
Expand All @@ -49,9 +37,8 @@ local instance = kube._Object('cdi.kubevirt.io/v1beta1', 'CDI', 'instance') {
};

// Define outputs below
if operator.enabled then
{
'00_namespace': namespace,
'10_bundle': helper.load('cdi-%s/cdi-operator.yaml' % operator.version, operator.namespace.name),
'20_instance': instance,
}
if helper.isEnabled('importer') then {
'20_importer/00_namespace': namespace,
'20_importer/10_bundle': helper.load('cdi-%s/cdi-operator.yaml' % operator.version, operator.namespace.name),
[if std.length(config) > 0 then '20_importer/20_instance']: instance,
} else {}
11 changes: 5 additions & 6 deletions component/kubevirt.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,8 @@ local instance = kube._Object('kubevirt.io/v1', 'KubeVirt', 'instance') {
};

// Define outputs below
if operator.enabled then
{
'00_namespace': namespace,
'10_bundle': helper.load('kubevirt-%s/kubevirt-operator.yaml' % operator.version, operator.namespace.name),
'20_instance': instance,
}
if helper.isEnabled('kubevirt') then {
'10_kubevirt/00_namespace': namespace,
'10_kubevirt/10_bundle': helper.load('kubevirt-%s/kubevirt-operator.yaml' % operator.version, operator.namespace.name),
[if std.length(config) > 0 then '10_kubevirt/20_instance']: instance,
} else {}
4 changes: 2 additions & 2 deletions component/kubevirt_types.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ local cluster = inv.parameters.kubevirt_operator.cluster;

// Define outputs below
{
['30_type_' + name]: kube._Object('instancetype.kubevirt.io/v1beta1', 'VirtualMachineClusterInstancetype', name) {
['80_type_' + name]: kube._Object('instancetype.kubevirt.io/v1beta1', 'VirtualMachineClusterInstancetype', name) {
metadata+: {
labels+: {
'app.kubernetes.io/managed-by': 'commodore',
Expand All @@ -19,7 +19,7 @@ local cluster = inv.parameters.kubevirt_operator.cluster;
}
for name in std.objectFields(cluster.types)
} + {
['40_preference_' + name]: kube._Object('instancetype.kubevirt.io/v1beta1', 'VirtualMachineClusterPreference', name) {
['80_preference_' + name]: kube._Object('instancetype.kubevirt.io/v1beta1', 'VirtualMachineClusterPreference', name) {
metadata+: {
labels+: {
'app.kubernetes.io/managed-by': 'commodore',
Expand Down
94 changes: 60 additions & 34 deletions docs/modules/ROOT/pages/references/parameters.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,36 @@ The parent key for all of the following parameters is `kubevirt_operator`.
Enable / Configure operators.


=== `hyperconverged`

[horizontal]
type:: dictionary
default::
+
[source,yaml]
----
hyperconverged:
enabled: false <1>
channel: stable <2>
namespace: <3>
annotations: {}
labels: {}
resources: {} <4>
----
<1> Enable Hyperconverged operator.
<2> Hyperconveged olm release channel.
<3> Configure KubeVirt namespace.
<4> Configure resources for operator.

Hyperconverged cluster operator configuration.

Deploying hyperconverged cluster operator will use OLM to install the operator.

This operator will manage all other operator contained in this component.

See https://github.com/kubevirt/hyperconverged-cluster-operator[Hyperconverged Cluster Operator Github] for documentation.


=== `kubevirt`

[horizontal]
Expand Down Expand Up @@ -70,46 +100,14 @@ Configure instances.

[horizontal]
type:: dictionary
default::
+
[source,yaml]
----
kubevirt:
certificateRotateStrategy: {}
configuration: {}
customizeComponents: {}
imagePullPolicy: IfNotPresent
workloadUpdateStrategy: {}
----

See https://kubevirt.io/user-guide/operations/customize_components[KubeVirt Documentation] for specs.
default:: See https://kubevirt.io/user-guide/operations/customize_components[KubeVirt Documentation].


=== `importer`

[horizontal]
type:: dictionary
default::
+
[source,yaml]
----
importer:
config:
featureGates:
- HonorWaitForFirstConsumer
imagePullPolicy: IfNotPresent
infra:
nodeSelector:
kubernetes.io/os: linux
tolerations:
- key: CriticalAddonsOnly
operator: Exists
workload:
nodeSelector:
kubernetes.io/os: linux
----

See https://github.com/kubevirt/containerized-data-importer/blob/main/doc/cdi-config.md[CDI Documentation] for specs.
default:: See https://github.com/kubevirt/containerized-data-importer/blob/main/doc/cdi-config.md[CDI Documentation].


== `cluster`
Expand Down Expand Up @@ -140,6 +138,34 @@ ClusterInstancePreferences configuration, see https://kubevirt.io/user-guide/vir
[source,yaml]
----
kubevirt_operator:
config:
kubevirt:
imagePullPolicy: IfNotPresent
infra:
nodeSelector:
kubernetes.io/os: linux
tolerations:
- key: CriticalAddonsOnly
operator: Exists
workload:
nodeSelector:
kubernetes.io/os: linux
importer:
config:
featureGates:
- HonorWaitForFirstConsumer
imagePullPolicy: IfNotPresent
infra:
nodeSelector:
kubernetes.io/os: linux
tolerations:
- key: CriticalAddonsOnly
operator: Exists
workload:
nodeSelector:
kubernetes.io/os: linux
cluster:
types:
small-4:
Expand Down
Loading

0 comments on commit e373f37

Please sign in to comment.