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 a72baf2
Show file tree
Hide file tree
Showing 36 changed files with 311 additions and 133 deletions.
40 changes: 20 additions & 20 deletions class/defaults.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@ parameters:
=_metadata: {}

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

kubevirt:
enabled: true
version: v1.1.1
Expand All @@ -24,28 +33,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: namespace.metadata.name,
},
};

local subscription = olm.namespacedSubscription(
namespace.metadata.name,
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: namespace.metadata.name,
},
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
64 changes: 30 additions & 34 deletions docs/modules/ROOT/pages/references/parameters.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -70,46 +70,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 +108,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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
spec:
source:
path: manifests/kubevirt-operator/importer
path: manifests/kubevirt-operator/20_importer
syncPolicy:
syncOptions:
- ServerSideApply=true
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
spec:
source:
path: manifests/kubevirt-operator/kubevirt
path: manifests/kubevirt-operator/10_kubevirt
syncPolicy:
syncOptions:
- ServerSideApply=true

This file was deleted.

Empty file.
Loading

0 comments on commit a72baf2

Please sign in to comment.