Skip to content

Commit f95133a

Browse files
committed
Initial implementation
1 parent 0577aea commit f95133a

38 files changed

Lines changed: 2843 additions & 11 deletions

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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,37 @@
11
parameters:
22
kapitan:
3+
dependencies:
4+
- type: helm
5+
source: ${cloud_provider_openstack:charts:openstack-cloud-controller-manager:source}
6+
version: ${cloud_provider_openstack:charts:openstack-cloud-controller-manager:version}
7+
chart_name: openstack-cloud-controller-manager
8+
output_path: ${_base_directory}/helmcharts/openstack-cloud-controller-manager/${cloud_provider_openstack:charts:openstack-cloud-controller-manager:version}
9+
- type: helm
10+
source: ${cloud_provider_openstack:charts:openstack-cinder-csi:source}
11+
version: ${cloud_provider_openstack:charts:openstack-cinder-csi:version}
12+
chart_name: openstack-cinder-csi
13+
output_path: ${_base_directory}/helmcharts/openstack-cinder-csi/${cloud_provider_openstack:charts:openstack-cinder-csi:version}
314
compile:
415
- input_paths:
516
- ${_base_directory}/component/app.jsonnet
617
input_type: jsonnet
718
output_path: .
19+
- input_paths:
20+
- ${_base_directory}/helmcharts/openstack-cloud-controller-manager/${cloud_provider_openstack:charts:openstack-cloud-controller-manager:version}
21+
input_type: helm
22+
helm_values: ${cloud_provider_openstack:ccm:helm_values}
23+
helm_params:
24+
name: openstack-ccm
25+
namespace: ${cloud_provider_openstack:namespace}
26+
output_path: cloud-provider-openstack/10_ccm_helm_chart
27+
- input_paths:
28+
- ${_base_directory}/helmcharts/openstack-cinder-csi/${cloud_provider_openstack:charts:openstack-cinder-csi:version}
29+
input_type: helm
30+
helm_values: ${cloud_provider_openstack:csi:helm_values}
31+
helm_params:
32+
name: cinder-csi
33+
namespace: ${cloud_provider_openstack:namespace}
34+
output_path: cloud-provider-openstack/20_csi_helm_chart
835
- input_paths:
936
- ${_base_directory}/component/main.jsonnet
1037
input_type: jsonnet

class/defaults.yml

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

component/app.jsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ local inv = kap.inventory();
33
local params = inv.parameters.cloud_provider_openstack;
44
local argocd = import 'lib/argocd.libjsonnet';
55

6-
local app = argocd.App('cloud-provider-openstack', params.namespace);
6+
local app = argocd.App('cloud-provider-openstack', params.namespace, secrets=true);
77

88
local appPath =
99
local project = std.get(std.get(app, 'spec', {}), 'project', 'syn');

component/main.jsonnet

Lines changed: 87 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,94 @@
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.isBoolean(v) then
13+
[ '%s=%s' % [ k, if v then 'true' else 'false' ] ]
14+
else
15+
[ '%s=%s' % [ k, std.toString(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,
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+
kube._Object('snapshot.storage.k8s.io/v1', 'VolumeSnapshotClass', name) {
78+
driver: 'cinder.csi.openstack.org',
79+
deletionPolicy: vsc.deletion_policy,
80+
[if std.length(vsc.parameters) > 0 then 'parameters']: vsc.parameters,
81+
}
82+
for name in std.objectFields(params.csi.volume_snapshot_classes)
83+
];
84+
985
{
86+
[if params.namespace != 'kube-system' then '00_namespace']:
87+
kube.Namespace(params.namespace),
88+
'01_secret': secret,
89+
[if std.length(params.csi.storage_classes) > 0 then '10_storageclasses']:
90+
storageClasses,
91+
[if std.length(params.csi.volume_snapshot_classes) > 0
92+
then '10_volumesnapshotclasses']:
93+
volumeSnapshotClasses,
1094
}

docs/modules/ROOT/pages/index.adoc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
= Cloud Provider OpenStack
1+
= cloud-provider-openstack
22

3-
cloud-provider-openstack is a Commodore component to manage Cloud Provider OpenStack.
3+
cloud-provider-openstack is a Commodore component to manage the https://github.com/kubernetes/cloud-provider-openstack[OpenStack Cloud Controller Manager] (CCM) and https://github.com/kubernetes/cloud-provider-openstack[Cinder CSI driver].
4+
5+
Both sub-components are enabled by default and share a single `cloud.conf` Secret.
6+
The CCM handles node initialization, node lifecycle, LoadBalancer Services (via Octavia), and optionally pod routes.
7+
The CSI driver provides persistent block storage using OpenStack Cinder volumes, with configurable StorageClasses and VolumeSnapshotClasses.
48

59
See the xref:references/parameters.adoc[parameters] reference for further details.

0 commit comments

Comments
 (0)