|
1 | | -// main template for cloud-provider-openstack |
2 | 1 | local kap = import 'lib/kapitan.libjsonnet'; |
3 | 2 | local kube = import 'lib/kube.libjsonnet'; |
| 3 | +local sc = import 'lib/storageclass.libsonnet'; |
| 4 | + |
4 | 5 | local inv = kap.inventory(); |
5 | | -// The hiera parameters for the component |
6 | 6 | local params = inv.parameters.cloud_provider_openstack; |
7 | 7 |
|
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 | + |
9 | 101 | { |
| 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, |
10 | 109 | } |
0 commit comments