Skip to content

Commit a7d6934

Browse files
authored
Merge pull request #1 from projectsyn/init-implementation
Initial implementation
2 parents 0577aea + 5b4d48f commit a7d6934

40 files changed

Lines changed: 3005 additions & 12 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
/jsonnetfile.lock.json
88
/crds
99
/compiled
10+
/helm_values
1011

1112
# Antora
1213
/_archive

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,4 @@ $(test_instances):
8181

8282
.PHONY: clean
8383
clean: ## Clean the project
84-
rm -rf .cache compiled dependencies vendor helmcharts jsonnetfile*.json || true
84+
rm -rf .cache compiled dependencies vendor helmcharts helm_values jsonnetfile*.json || true

Makefile.vars.mk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ git_dir ?= $(shell git rev-parse --git-common-dir)
55
compiled_path ?= compiled/$(COMPONENT_NAME)/$(COMPONENT_NAME)
66
root_volume ?= -v "$${PWD}:/$(COMPONENT_NAME)"
77
compiled_volume ?= -v "$${PWD}/$(compiled_path):/$(COMPONENT_NAME)"
8-
commodore_args ?= --search-paths . -n $(COMPONENT_NAME)
8+
commodore_args ?= --search-paths ./dependencies --search-paths . -n $(COMPONENT_NAME)
99

1010
ifneq "$(git_dir)" ".git"
1111
git_volume ?= -v "$(git_dir):$(git_dir):ro"
@@ -50,4 +50,4 @@ KUBENT_IMAGE ?= ghcr.io/doitintl/kube-no-trouble:latest
5050
KUBENT_DOCKER ?= $(DOCKER_CMD) $(DOCKER_ARGS) $(root_volume) --entrypoint=/app/kubent $(KUBENT_IMAGE)
5151

5252
instance ?= defaults
53-
test_instances = tests/defaults.yml
53+
test_instances = tests/defaults.yml tests/cloud-config.yml

class/cloud-provider-openstack.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,59 @@
11
parameters:
2+
_os_ccm_chart:
3+
"True":
4+
input_paths:
5+
- ${_base_directory}/helmcharts/openstack-cloud-controller-manager/${cloud_provider_openstack:charts:openstack-cloud-controller-manager:version}
6+
input_type: helm
7+
helm_params:
8+
name: openstack-ccm
9+
namespace: ${cloud_provider_openstack:namespace:name}
10+
helm_values_files:
11+
- ${_base_directory}/helm_values/ccm-values.yaml
12+
output_path: cloud-provider-openstack/10_ccm_helm_chart
13+
"False":
14+
input_type: jsonnet
15+
input_paths: []
16+
output_path: cloud-provider-openstack/
17+
18+
_os_csi_chart:
19+
"True":
20+
input_paths:
21+
- ${_base_directory}/helmcharts/openstack-cinder-csi/${cloud_provider_openstack:charts:openstack-cinder-csi:version}
22+
input_type: helm
23+
helm_params:
24+
name: cinder-csi
25+
namespace: ${cloud_provider_openstack:namespace:name}
26+
helm_values_files:
27+
- ${_base_directory}/helm_values/csi-values.yaml
28+
output_path: cloud-provider-openstack/20_csi_helm_chart
29+
"False":
30+
input_type: jsonnet
31+
input_paths: []
32+
output_path: cloud-provider-openstack/
33+
234
kapitan:
35+
dependencies:
36+
- type: helm
37+
source: ${cloud_provider_openstack:charts:openstack-cloud-controller-manager:source}
38+
version: ${cloud_provider_openstack:charts:openstack-cloud-controller-manager:version}
39+
chart_name: openstack-cloud-controller-manager
40+
output_path: ${_base_directory}/helmcharts/openstack-cloud-controller-manager/${cloud_provider_openstack:charts:openstack-cloud-controller-manager:version}
41+
- type: helm
42+
source: ${cloud_provider_openstack:charts:openstack-cinder-csi:source}
43+
version: ${cloud_provider_openstack:charts:openstack-cinder-csi:version}
44+
chart_name: openstack-cinder-csi
45+
output_path: ${_base_directory}/helmcharts/openstack-cinder-csi/${cloud_provider_openstack:charts:openstack-cinder-csi:version}
346
compile:
447
- input_paths:
548
- ${_base_directory}/component/app.jsonnet
649
input_type: jsonnet
750
output_path: .
51+
- input_paths:
52+
- ${_base_directory}/component/render-helm-values.jsonnet
53+
input_type: jsonnet
54+
output_path: ${_base_directory}/helm_values/
55+
- ${_os_ccm_chart:${cloud_provider_openstack:ccm:enabled}}
56+
- ${_os_csi_chart:${cloud_provider_openstack:csi:enabled}}
857
- input_paths:
958
- ${_base_directory}/component/main.jsonnet
1059
input_type: jsonnet

class/defaults.yml

Lines changed: 165 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,168 @@ parameters:
22
cloud_provider_openstack:
33
=_metadata:
44
multi_tenant: true
5-
namespace: syn-cloud-provider-openstack
5+
namespace:
6+
name: syn-cloud-provider-openstack
7+
labels: {}
8+
annotations: {}
9+
10+
charts:
11+
openstack-cloud-controller-manager:
12+
source: https://kubernetes.github.io/cloud-provider-openstack
13+
version: "2.35.0"
14+
openstack-cinder-csi:
15+
source: https://kubernetes.github.io/cloud-provider-openstack
16+
version: "2.35.0"
17+
18+
images:
19+
openstack_cloud_controller_manager:
20+
registry: registry.k8s.io
21+
repository: provider-os/openstack-cloud-controller-manager
22+
tag: v1.35.0
23+
cinder_csi_plugin:
24+
registry: registry.k8s.io
25+
repository: provider-os/cinder-csi-plugin
26+
tag: v1.35.0
27+
28+
cloud_config_secret_name: cloud-config
29+
30+
cloud_conf:
31+
global: {}
32+
networking: {}
33+
load_balancer: {}
34+
load_balancer_classes: {}
35+
block_storage: {}
36+
metadata: {}
37+
route: {}
38+
39+
ccm:
40+
enabled: true
41+
cluster_name: ${cluster:name}
42+
service_account_name: cloud-controller-manager
43+
resources:
44+
requests:
45+
cpu: 50m
46+
memory: 64Mi
47+
enabled_controllers:
48+
- cloud-node
49+
- cloud-node-lifecycle
50+
- service
51+
log_verbosity_level: 2
52+
node_selector:
53+
node-role.kubernetes.io/control-plane: ""
54+
tolerations:
55+
node.cloudprovider.kubernetes.io/uninitialized:
56+
value: "true"
57+
effect: NoSchedule
58+
node-role.kubernetes.io/control-plane:
59+
effect: NoSchedule
60+
service_monitor:
61+
enabled: false
62+
additionalLabels: {}
63+
extra_volumes: []
64+
extra_volume_mounts: []
65+
helm_values:
66+
secret:
67+
enabled: true
68+
create: false
69+
name: ${cloud_provider_openstack:cloud_config_secret_name}
70+
cluster:
71+
name: ${cloud_provider_openstack:ccm:cluster_name}
72+
serviceAccountName: ${cloud_provider_openstack:ccm:service_account_name}
73+
image:
74+
repository: ${cloud_provider_openstack:images:openstack_cloud_controller_manager:registry}/${cloud_provider_openstack:images:openstack_cloud_controller_manager:repository}
75+
tag: ${cloud_provider_openstack:images:openstack_cloud_controller_manager:tag}
76+
resources: ${cloud_provider_openstack:ccm:resources}
77+
logVerbosityLevel: ${cloud_provider_openstack:ccm:log_verbosity_level}
78+
nodeSelector: ${cloud_provider_openstack:ccm:node_selector}
79+
serviceMonitor: ${cloud_provider_openstack:ccm:service_monitor}
80+
extraVolumes: ${cloud_provider_openstack:ccm:extra_volumes}
81+
extraVolumeMounts: ${cloud_provider_openstack:ccm:extra_volume_mounts}
82+
83+
csi:
84+
enabled: true
85+
cluster_id: ${cluster:name}
86+
fs_type: ext4
87+
volume_binding_mode: WaitForFirstConsumer
88+
log_verbosity_level: 2
89+
pod_monitor:
90+
enabled: false
91+
additionalLabels: {}
92+
controller_plugin:
93+
node_selector:
94+
node-role.kubernetes.io/control-plane: ""
95+
tolerations:
96+
node-role.kubernetes.io/control-plane:
97+
effect: NoSchedule
98+
node_plugin:
99+
tolerations:
100+
"":
101+
operator: Exists
102+
resources:
103+
controller:
104+
csi-provisioner:
105+
requests:
106+
cpu: 20m
107+
memory: 32Mi
108+
csi-attacher:
109+
requests:
110+
cpu: 20m
111+
memory: 32Mi
112+
csi-resizer:
113+
requests:
114+
cpu: 20m
115+
memory: 32Mi
116+
csi-snapshotter:
117+
requests:
118+
cpu: 20m
119+
memory: 32Mi
120+
cinder-csi-plugin:
121+
requests:
122+
cpu: 20m
123+
memory: 64Mi
124+
node:
125+
node-driver-registrar:
126+
requests:
127+
cpu: 20m
128+
memory: 32Mi
129+
cinder-csi-plugin:
130+
requests:
131+
cpu: 20m
132+
memory: 64Mi
133+
storage_classes: {}
134+
volume_snapshot_classes: {}
135+
helm_values:
136+
secret:
137+
enabled: true
138+
create: false
139+
hostMount: false
140+
name: ${cloud_provider_openstack:cloud_config_secret_name}
141+
clusterID: ${cloud_provider_openstack:csi:cluster_id}
142+
logVerbosityLevel: ${cloud_provider_openstack:csi:log_verbosity_level}
143+
storageClass:
144+
enabled: false
145+
csi:
146+
provisioner:
147+
resources: ${cloud_provider_openstack:csi:resources:controller:csi-provisioner}
148+
attacher:
149+
resources: ${cloud_provider_openstack:csi:resources:controller:csi-attacher}
150+
resizer:
151+
resources: ${cloud_provider_openstack:csi:resources:controller:csi-resizer}
152+
snapshotter:
153+
resources: ${cloud_provider_openstack:csi:resources:controller:csi-snapshotter}
154+
nodeDriverRegistrar:
155+
resources: ${cloud_provider_openstack:csi:resources:node:node-driver-registrar}
156+
plugin:
157+
image:
158+
repository: ${cloud_provider_openstack:images:cinder_csi_plugin:registry}/${cloud_provider_openstack:images:cinder_csi_plugin:repository}
159+
tag: ${cloud_provider_openstack:images:cinder_csi_plugin:tag}
160+
volumes: []
161+
volumeMounts:
162+
- name: cloud-config
163+
mountPath: /etc/config
164+
readOnly: true
165+
resources: ${cloud_provider_openstack:csi:resources:controller:cinder-csi-plugin}
166+
httpEndpoint:
167+
enabled: ${cloud_provider_openstack:csi:pod_monitor:enabled}
168+
port: 8080
169+
podMonitor: ${cloud_provider_openstack:csi:pod_monitor}

component/main.jsonnet

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,109 @@
1-
// main template for cloud-provider-openstack
21
local kap = import 'lib/kapitan.libjsonnet';
32
local kube = import 'lib/kube.libjsonnet';
3+
local sc = import 'lib/storageclass.libsonnet';
4+
45
local inv = kap.inventory();
5-
// The hiera parameters for the component
66
local params = inv.parameters.cloud_provider_openstack;
77

8-
// Define outputs below
8+
local renderValue(k, v) =
9+
if v == null then []
10+
else if std.isArray(v) then
11+
[ '%s=%s' % [ k, item ] for item in v if item != null ]
12+
else if std.isObject(v) then
13+
error 'cloud_conf value for key "%s" must be scalar or array, got object' % k
14+
else
15+
[ '%s=%s' % [ k, v ] ];
16+
17+
local renderSection(name, dict) =
18+
local lines = std.flattenArrays(
19+
[ renderValue(k, dict[k]) for k in std.objectFields(dict) ]
20+
);
21+
if std.length(lines) == 0 then []
22+
else [ '[%s]' % name ] + lines + [ '' ];
23+
24+
local renderLBClasses(classes) =
25+
std.flattenArrays([
26+
renderSection('LoadBalancerClass "%s"' % cls, classes[cls])
27+
for cls in std.objectFields(classes)
28+
if std.length(std.objectFields(classes[cls])) > 0
29+
]);
30+
31+
local renderCloudConf() =
32+
std.join(
33+
'\n',
34+
renderSection('Global', params.cloud_conf.global) +
35+
renderSection('Networking', params.cloud_conf.networking) +
36+
renderSection('LoadBalancer', params.cloud_conf.load_balancer) +
37+
renderLBClasses(params.cloud_conf.load_balancer_classes) +
38+
renderSection('BlockStorage', params.cloud_conf.block_storage) +
39+
renderSection('Metadata', params.cloud_conf.metadata) +
40+
renderSection('Route', params.cloud_conf.route)
41+
);
42+
43+
local secret = kube.Secret(params.cloud_config_secret_name) {
44+
metadata+: {
45+
namespace: params.namespace.name,
46+
},
47+
data:: {},
48+
stringData: {
49+
'cloud.conf': renderCloudConf(),
50+
},
51+
};
52+
53+
local scParameters(scDef) =
54+
local base =
55+
if params.csi.fs_type != null && params.csi.fs_type != ''
56+
then { fsType: params.csi.fs_type }
57+
else {};
58+
base + scDef.parameters;
59+
60+
local storageClasses = [
61+
local scDef = params.csi.storage_classes[name];
62+
sc.storageClass(name) {
63+
provisioner: 'cinder.csi.openstack.org',
64+
reclaimPolicy: std.get(scDef, 'reclaim_policy', 'Delete'),
65+
allowVolumeExpansion: std.get(scDef, 'allow_volume_expansion', true),
66+
volumeBindingMode: params.csi.volume_binding_mode,
67+
parameters: scParameters(scDef),
68+
[if std.length(std.get(scDef, 'allowed_topologies', [])) > 0
69+
then 'allowedTopologies']:
70+
scDef.allowed_topologies,
71+
}
72+
for name in std.objectFields(params.csi.storage_classes)
73+
];
74+
75+
local volumeSnapshotClasses = [
76+
local vsc = params.csi.volume_snapshot_classes[name];
77+
local vscParams = std.get(vsc, 'parameters', {});
78+
kube._Object('snapshot.storage.k8s.io/v1', 'VolumeSnapshotClass', name) {
79+
driver: 'cinder.csi.openstack.org',
80+
deletionPolicy: vsc.deletion_policy,
81+
[if std.length(vscParams) > 0 then 'parameters']: vscParams,
82+
}
83+
for name in std.objectFields(params.csi.volume_snapshot_classes)
84+
];
85+
86+
local namespace = kube.Namespace(params.namespace.name) {
87+
metadata+: {
88+
labels+: {
89+
[k]: params.namespace.labels[k]
90+
for k in std.objectFields(params.namespace.labels)
91+
if params.namespace.labels[k] != null
92+
},
93+
annotations+: {
94+
[k]: params.namespace.annotations[k]
95+
for k in std.objectFields(params.namespace.annotations)
96+
if params.namespace.annotations[k] != null
97+
},
98+
},
99+
};
100+
9101
{
102+
[if params.namespace.name != 'kube-system' then '00_namespace']: namespace,
103+
'01_secret': secret,
104+
[if std.length(params.csi.storage_classes) > 0 then '10_storageclasses']:
105+
storageClasses,
106+
[if std.length(params.csi.volume_snapshot_classes) > 0
107+
then '10_volumesnapshotclasses']:
108+
volumeSnapshotClasses,
10109
}

0 commit comments

Comments
 (0)