Compare commits

...

297 Commits

Author SHA1 Message Date
gulecroc
e8ab0c6ded
Feat/cacerts (#619) 2025-06-21 23:13:35 +03:00
Artem Nosulchyk
3e5c82c229
extra volume mounts for oxia coordinator (#618)
* extra volume mounts for oxia coordinator

* .

* .
2025-06-13 10:55:02 -07:00
Lari Hotari
7cd7078695
Add labels to all k8s objects (#617)
* Add labels to all k8s objects

* Add labels to initialization job pods
2025-06-09 21:27:23 +03:00
Lari Hotari
2d16ffefd4
Use PEM files directly as ZooKeeper keystore and truststore (#613) 2025-05-30 18:16:04 +03:00
Lari Hotari
fdcfe60fe9 Chart: Bump version to 4.1.0 2025-05-23 16:52:39 +03:00
gulecroc
1180db46cd
add template for ca issuer name and secret name (#565)
* set template for ca issuer name and secret name + geo-replication installation example

* remove geo-replication from this PR

* use certs template to define ca name and secret name

* Handle proxy, toolset and zookeeper in the same way as others

* Make the logic more consistent by separating the selfsigning issuer configuration

---------

Co-authored-by: GLECROC <guillaume.lecroc@cnp.fr>
Co-authored-by: Lari Hotari <lhotari@users.noreply.github.com>
Co-authored-by: Lari Hotari <lhotari@apache.org>
2025-05-23 16:22:17 +03:00
Lari Hotari
51a535d83d
Upgrade to Pulsar 4.0.5 (#612) 2025-05-23 15:28:31 +03:00
trynocoding
352ed0846b
Fix broker initialization error when using global Zookeeper (#602) (#603) 2025-05-21 12:20:41 +03:00
Bruno Domenici
a9f2ba76ae
OpenID: introducing support for OpenID configuration (#509)
* feat!(openid): introducing support for openid configuration

BREAKING CHANGE: provider configuration changed from auth.authentication.provider to auth.authentication.jwt.enabled

* add upgrading to 4.1.0

* add validation for deprecated values

* add openid CI with keycloak

* fix chart-testing lint new-line-at-end-of-file

* fix keycloak dependency repository

* fix keycloak repository

* fix yaml to json convert error

* disable keycloak to validate github actions before re-enable it

* disable openid test scenario

* disable keycloak in values

* enable keycloak without authentication and authorization

* add openid test scenario

* disable test scenario other than openid

* enable all test scenario

* disable functions component

* create openid resources

* test truncate command

* test truncate command

* change client_secret generator

* change client_secret generator

* test python

* fix script

* fix script

* print python result

* test python

* test python

* fix client_secret generation

* fix create openid resources

* fix secret name

* fix mount keycloak config

* fix keycloak service

* exclude keycloak from chart

* add license

* add license

* wait keycloak is alive

* fix keycloak chart install namespace

* add test pulsar real openid config

* fix keycloak issuer url

* fix pod name

* remove check keycloak alive

* check realm pulsar openid configuration

* change keycloak service

* remove test keyclock service

* remove selector to get all pod log

* wait keycloak is alive

* check keycloak realm pulsar urls

* wait until keycloak is ready

* add wait timeout

* fix realm pulsar name

* add log to debug

* add openid for toolset

* set authorization

* set authorization

* fix client template filename

* fix install keycloak

* disable authorization

* debug sub claim value

* fix sub claim value

* cleanup

* enable all build

---------

Co-authored-by: glecroc <guillaume.lecroc@cnp.fr>
2025-05-20 14:09:12 +03:00
Lari Hotari
52d3164b8d
Upgrade oxia image to 0.12.0 in default values.yaml (#611) 2025-05-20 03:29:49 -07:00
Artem Nosulchyk
9ddbf4bc86
extra containers and volumes for oxia coordinator (#609) 2025-05-20 13:13:07 +03:00
Artem Nosulchyk
fa1456ea4d
configurable oxia coordinator configmap and entrypoint (#606) 2025-05-19 16:16:40 +03:00
Artem Nosulchyk
8382906775
annotations (#610) 2025-05-13 16:35:44 -07:00
Austin Poole
57fa527b04
update nodeSelector for bookkeeper cluster initializer (#608) 2025-05-10 11:57:16 +03:00
Haim Kortovich
77ec4cedfb
Add appAnnotations for all statefulsets (#604) 2025-05-07 09:05:19 +03:00
Artem Nosulchyk
cd701ecedd
add support of extra volumes and mounts for autorecovery (#607) 2025-05-07 08:44:11 +03:00
Artem Nosulchyk
d4afc985d2
oxia components podmonitor match labels (#605) 2025-05-06 22:27:27 +03:00
Lari Hotari
7833e51c28 Chart: Bump version to 4.0.1 2025-04-15 11:05:33 +03:00
gulecroc
6e824f0c4e
Fix bookkeeper.extraVolumes (#596) 2025-04-15 01:04:10 -07:00
Lari Hotari
b703761a52
Upgrade Oxia to 0.11.15 (#600) 2025-04-15 00:50:32 -07:00
Lari Hotari
8d889eb971
Upgrade to Pulsar 4.0.4 (#599) 2025-04-15 00:24:48 -07:00
Lari Hotari
6ff77e8c65
Update RELEASE.md 2025-03-14 00:51:58 -07:00
Lari Hotari
e7b08065a1
Update RELEASE.md 2025-03-14 00:46:19 -07:00
Lari Hotari
3f75320f18 Update RELEASE.md 2025-03-11 02:44:10 +02:00
Lari Hotari
a30291e7df
Update RELEASE.md 2025-03-10 17:22:39 -07:00
Lari Hotari
20f7fc8d79 Update README 2025-03-11 02:19:27 +02:00
Lari Hotari
637cf11d1a
Fix Grafana dashboards for Broker with honorLabels, remove unnecessary *_created metrics and improve docs (#593)
* Drop _created metrics for broker and proxy

* Enable all metrics by default for broker

* change default dashboard

* Remove messy dashboards

* Enable default dashboards in Grafana

* Add testing values with more aggressive disk cleanup

* Add VictoriaMetrics debugging instructions

* Set honorLabels to true

* Document disabling monitoring

* Set password in testing values

* Fix linting issue detected by kubeconform
2025-03-10 16:46:28 -07:00
Lari Hotari
e6f05809bd
Migrate from kube-prometheus-metrics to victoria-metrics-k8s-stack (#592) 2025-03-08 16:36:41 -08:00
Lari Hotari
302db43e91
Remove PSP support (#591) 2025-03-08 12:00:35 -08:00
Lari Hotari
75119dd6d7
Remove Prometheus scrape annotations when podmonitors are enabled (#590) 2025-03-07 09:51:06 -08:00
Lari Hotari
6fe37a373f
Use bookkeeperMetadataServiceUri in broker and make PulsarMetadataClientDriver configurable (#589) 2025-03-07 09:24:03 -08:00
Lari Hotari
dd1325216f
Change Pulsar Proxy service load balancer type to ClusterIP (#588) 2025-03-06 05:03:42 -08:00
Lari Hotari
976ba92e3b
Test with k8s 1.32.2 and upgrade tool versions used in CI (#587)
- kind 0.22.0 -> 0.27.0
- test with k8s 1.32.2 instead of 1.29.2 to ensure compatibility with latest k8s release
- default helm version 3.14.4 -> 3.16.4
- chart releaser 1.6.0 -> 1.7.0
- ubuntu 22.04 -> 24.04
- chart testing 3.11.0 -> 3.12.0
- yamllint 1.33.0 -> 1.35.1
- yamale 4.0.4 -> 6.0.0
2025-03-05 23:50:44 -08:00
Lari Hotari
18c4cc5440 Add comment warning about enabling PulsarMetadataBookieDriver
- upgrade compatibility tests didn't pass with this setting, so more testing is needed
2025-03-06 09:49:56 +02:00
Lari Hotari
601e78d8a5
Add Broker Cache and Sockets dashboards (#586) 2025-03-05 23:24:19 -08:00
Lari Hotari
80999ff1d8
Use BookKeeper BP-29 metadataServiceUri to configure bookie metadata store, also when using Zookeeper (#585) 2025-03-05 23:24:07 -08:00
Lari Hotari
87b48d0610
Update RELEASE.md 2025-03-04 13:16:33 -08:00
Lari Hotari
9f61859d19
Use PIP-45 metadata store config to replace deprecated ZK config and make PulsarMetadataBookieDriver configurable in BK (#576) 2025-03-04 20:23:35 +02:00
Lari Hotari
a55b1bb560
Remove the dependency to pulsarctl when generating JWT tokens (#584) 2025-03-04 20:18:10 +02:00
Lari Hotari
43f8dfa04e
Revisit solution to configure Bookkeeper RocksDB settings - default to individual config files (#583) 2025-03-04 04:04:38 -08:00
Lari Hotari
f98ee7d69c
Replace ">" with "|" to avoid Go Yaml issue go-yaml/yaml#789 (#582) 2025-03-04 02:21:39 -08:00
Lari Hotari
589b0b1b24
Upgrade default cert-manager version to 1.12.16 (#581) 2025-03-04 01:02:25 -08:00
Lari Hotari
5c1b7a9288
Restore support for dbStorage_rocksDB_* settings defined in bookkeeper.configData (#580) 2025-03-03 22:05:59 -08:00
Lari Hotari
4bdf6d51eb
Improve kube-prometheus-stack config in values.yaml by adding missing key and some basic comments (#579)
* Enable prometheusOperator in CI test

* Add comments and add offloader dashboard
2025-03-03 11:09:25 -08:00
Lari Hotari
4de387e726
Workaround issue with Prometheus 3.0 and metrics (#577)
* Add "fallbackScrapeProtocol: PrometheusText0.0.4" to all pod monitors
2025-03-03 06:26:04 -08:00
Lari Hotari
492e273d82
Upgrade to kube-prometheus-stack 69.x including prometheus-operator 0.80.0 defaulting to Prometheus 3.x (#578)
* Upgrade to kube-prometheus-stack 67.x
  * Prometheus operator is upgraded to 0.80.0
  * Prometheus is upgraded from 2.55.0 to 3.2.1

* Enable pod monitors to test them

* Run linting with kube-prometheus-stack enabled

* Validate all CI configs
2025-03-03 05:49:03 -08:00
Lari Hotari
afca5aaf08
Upgrade to Pulsar 4.0.3 (#575) 2025-02-28 09:18:10 -08:00
Lari Hotari
4386eacba8
[fix] Fix broker service annotations issue and other annotations issues (#574)
* Fix broker services annotations issues

* Add annotations support to autorecovery.service

* Consistently use similar way to handle annotations

* Add autorecovery service annotations key to values.yaml
2025-02-28 09:17:54 -08:00
Lari Hotari
f928380124
Fix pulsar-cluster-initialize / pulsar-init rendering with kustomize (#572)
* Fix pulsar-cluster-initialize / pulsar-init rendering with kustomize

- reapply #166 changes that were reverted by #544 changes

* Add validation for kustomize output in CI
2025-02-19 00:46:24 -08:00
Philipp Dolif
ab46d2165e
Increase defaults for ensemble size, write quorum, and ack quorum to 2 (#570) 2025-02-18 22:27:34 -08:00
Alejandro Ramirez
0b6b03002c
Fix OOM issue on broker wait-zookeeper-ready initContainer (#568) 2025-02-18 22:26:39 -08:00
Lari Hotari
e55405cbe2 Improve RELEASE.md
- address word wrap issue in validation instructions
2025-01-20 19:22:51 +02:00
Lari Hotari
7717adfab4 Chart: Bump version to 3.9.0 2025-01-20 19:11:45 +02:00
Lari Hotari
ee119d4f29
Use Pulsar 3.0.9 as previous LTS version in CI (#564) 2025-01-20 09:06:01 -08:00
Lari Hotari
dd1aa5e119
Use Pulsar 4.0.2 image by default (#563) 2025-01-20 08:22:16 -08:00
Eric Shen
b5ff00b16b
feat(tls): support ca type issuer and v1alpha* version cert-manager api (#561) 2024-12-18 07:11:54 -08:00
Raúl Sánchez
df9284dc97
Fix helm chart to allow configurable ingress pathType (#558) 2024-12-11 07:21:03 -08:00
Lari Hotari
05c78df4c5 Chart: Bump version to 3.8.0 2024-12-05 21:28:53 +02:00
Lari Hotari
d09ab8c4a7
Upgrade to Pulsar 4.0.1 image (#557) 2024-12-05 11:26:21 -08:00
Lari Hotari
0eeb7830a9
Revert "Wrap Zookeeper probe script with timeout command (#214)" (#556)
This reverts commit 22f4b9b3bd18a16c477003338464dfe5a689e074.
2024-12-02 01:35:22 -08:00
Lari Hotari
07689860f6
Fix Oxia config so that it includes a list of all pods in the statefulset (#553)
* Fix Oxia config so that it includes a list of all pods in the statefulset

* Test Oxia with 3 replicas since some issues only come up with more nodes

* Make internal name not a fqdn

* Fix issue with insufficient cpu requests in CI
2024-11-22 05:54:11 -08:00
Lari Hotari
cc12992d8f
Fix invalid internal server name in Oxia config (#552)
.svc doesn't resolve. it's better to use the fully qualified name
2024-11-22 04:35:54 -08:00
Yuwei Sung
c6ce11a9b7
Add support for using Oxia as the metadata store for Pulsar and BookKeeper (#544)
Co-authored-by: Lari Hotari <lhotari@apache.org>
2024-11-21 16:52:20 -08:00
Liam Gibson
17b739d10a
Add support for admin port on ZooKeeper (#550)
* Add support for admin port on ZooKeeper

* Make ZK admin port conditional
2024-11-20 09:27:44 -08:00
doug-ba
f6b6d88847
Correct pulsar proxy prometheus.io/port annotation (#548) 2024-11-18 21:39:24 -08:00
lenglet-k
ed50c68633
feat: add loadBalancerClass for proxy and pulsar-manager (#546)
* feat: add loadBalancerClass for proxy and pulsar-manager

Co-authored-by: Lari Hotari <lhotari@users.noreply.github.com>
2024-11-08 07:23:45 -08:00
Lari Hotari
d877fc3312
Use Pulsar 4.0.0 image, bump chart version to 3.7.0, kube-prometheus-stack to 65.x (#542)
* Use Pulsar 4.0.0 image, bump chart version to 3.7.0

* Bump kube-prometheus-stack to 65.x.x

* Remove testing with latest and test with previous LTS version

- run kube-prometheus-stack test with previous LTS version since
  the older chart version doesn't support Pulsar 4.0.0 image

* Fix passing "--values" to helm command

* Move ci runner config to a script

* Attempt to fix pulsar-manager-cluster-initialize
2024-10-29 15:29:27 -07:00
ChaoYang
64e67c1a88
update role (#543) 2024-10-29 15:28:47 -07:00
lenglet-k
db20c2bfa6
fix: broker extraEnv variable (#540)
* fix: broker extraEnv variable

* fix: comment extraEnv for broker as default values

* fix(typo): rename extreEnvs to extraEnvs
2024-10-18 00:07:24 -07:00
Lari Hotari
9e499db308
Test with 3.3.2 image (#541) 2024-10-18 00:06:49 -07:00
lenglet-k
346c5cdcd4
feat! add extraVolumes and Mounts for pulsar-manager (#535) 2024-10-08 05:00:00 -07:00
Lari Hotari
727e8c8b0d Chart: Bump version to 3.6.0 2024-10-04 23:01:20 +03:00
Lari Hotari
64b0769dc1
Use Pulsar 3.0.7 image by default (#536) 2024-10-04 12:55:06 -07:00
lenglet-k
75c00ebc7a
feat: add imagepullsecrets on pulsar-manager-initialize job (#533) 2024-10-02 17:15:46 -07:00
Lari Hotari
fffdcfc1ad
Fix compatibility with Pulsar 3.3.x+ docker images where /pulsar isn't writable (#531) 2024-09-27 12:17:12 -07:00
Shu.Wang
a45bc4bfe1
Add topologyspreadconstraint to deploy pods in sts cross different az evenly (#526)
Signed-off-by: Wang, Shu <shu.wang@fmr.com>
2024-09-26 21:37:15 -07:00
Lari Hotari
5276bd69ad Upgrade deprecated GitHub Actions in the CI workflow 2024-09-27 07:29:24 +03:00
Lari Hotari
6b31946fc7 Upgrade deprecated actions/upload-artifact@v2 to v4 2024-09-26 20:39:41 +03:00
ludmanl
54401c0b9a
feat: Support to customize broker podManagementPolicy from values.yaml (#525) 2024-09-03 03:47:52 -07:00
Duncan Schulze
0031827761
Support using self generated certificates (#523)
* Support using self generated certificates

* chore: fix linting
2024-08-23 17:49:36 +03:00
Lari Hotari
ac4f5a6627
Upgrade cert-manager to v1.12.13 (#517)
- cert-manager 1.12 is a LTS release, EOL until May 2025
2024-08-15 01:34:20 -07:00
Lari Hotari
dc817205a1
Bump minimum k8s version to 1.23.0 (#518) 2024-08-15 00:55:22 -07:00
Starry
093fa273f8
Add initContainers to templates (#516) 2024-08-05 09:40:55 -07:00
Lari Hotari
7675e4270d
Test compatibility with Pulsar 3.3.1 (#515) 2024-08-01 12:46:21 -07:00
Lari Hotari
70c4779542
Bump app version to 3.0.6 (#514) 2024-08-01 12:42:23 -07:00
Lari Hotari
70f36ffe43
Add timeouts for cluster metadata initialization and for init containers (#218)
- Add timeouts for waiting for zk and bk to become available.
- If the waiting gets stuck for some reason, the Pulsar deployment never
  becomes starts the broker services.
  - timeouts will help failures recover eventually
2024-06-20 10:07:48 -07:00
Lari Hotari
023f902a02
Allow specifying default pull policy and functions pull policy (#507) 2024-06-12 04:16:48 -07:00
Lari Hotari
9db0cccaca
Make zookeeper healthchecks compatible with Alpine's busybox nc (#504)
* Make zookeeper healthchecks compatible with Alpine's busybox nc

* Test Pulsar 3.3.0 image

* Use 127.0.0.1 instead of localhost in zookeeper healthchecks

- Alpine nc fails if "localhost" is used.
  - perhaps it defaults to use IPv6?

* Disable testing with Pulsar 3.3.0 image until 3.3.1 is released

- the image needs "apk add bind-tools" since busybox nslookup isn't compatible with kubernetes
2024-06-08 08:52:06 +03:00
Lari Hotari
47c2ac442a
Add defaultPulsarImageRepository configuration (#503)
- makes it easier to use a custom image
2024-06-05 04:20:16 -07:00
Lari Hotari
aebf5fb0d5
Upgrade kube-prometheus-stack to 59.x.x (#502) 2024-06-05 04:20:07 -07:00
Massimiliano Mirelli
6e84409b48
Support NodePort Proxy service (#500)
* Enables nodeport support for the proxy

* Correct indentation and remove null `nodePort`

Removing null `nodePort` causes k8s to pick up a random port

* Address review comment

https://github.com/apache/pulsar-helm-chart/pull/500/files#r1605762312
2024-06-04 08:46:16 -07:00
Massimiliano Mirelli
cb5c44f8ec
Allow broker's service clusterIP customisation (#498)
* Allow broker's service clusterIP customisation

This customisation is useful to configure headless vs non-headless
broker's service. The default is headless broker service, i.e. a
service for which kubernetes  does not allocate an IP
address (https://kubernetes.io/docs/concepts/services-networking/service/#type-clusterip). A
headless service is a very simple type of service that doesn't seem to work well
when pulsar service is exposed by pulsar-proxy via a nodeport.

Addresses #497.

* Address review comments

https://github.com/apache/pulsar-helm-chart/pull/498/files#r1605762934
and https://github.com/apache/pulsar-helm-chart/pull/498/files#r1605763245

* Move doc to Values.broker.service
2024-06-04 08:45:14 -07:00
Lari Hotari
3ecc2baab8 Chart: Bump version to 3.4.1 2024-05-17 17:55:45 +03:00
Lari Hotari
6795ad5c2c
Use Pulsar 3.0.5 as the default Pulsar version (appVersion) (#499) 2024-05-17 07:54:09 -07:00
MonicaMagoniCom
c4941b32d1
Add namespace to hpa templates (#494) 2024-05-03 11:48:02 -07:00
Lari Hotari
bd8bc633df
Change default statusFilePath to /pulsar/logs/status (#489)
* Change default statusFilePath to /pulsar/logs/status

* Write OK to statusFilePath
2024-04-15 05:41:17 -07:00
Lari Hotari
59f6f74fd7
Fix prometheus node-exporter crashloop (#488) 2024-04-12 03:10:24 -07:00
Lari Hotari
ee4b7a7988
Increase default Prometheus scrape interval to 60s (#487) 2024-04-11 07:35:57 -07:00
Martin
7c7ca4a7bc
enable message peeking (#486) 2024-04-10 23:20:37 -07:00
Martin
347326e0c3
Fix pulsar-manager persistence (#485)
- only setup environment in pulsar manager if broker is deployed
- fix indent
- enable persistence for manager and move configs around
2024-04-03 21:28:46 -07:00
Lari Hotari
d9e65836e8 Chart: Bump version to 3.4.0 2024-04-02 16:31:14 +03:00
Lari Hotari
a8776fd76c
Upgrade appVersion to 3.0.4 to use Pulsar 3.0.4 by default (#484) 2024-04-02 06:28:38 -07:00
Lari Hotari
88638d6b66 Increase timeouts in CI
- metallb timeout from 90s to 120s
- chart installation timeout from 300s to 360s
2024-04-02 10:14:09 +03:00
Lari Hotari
fdd46f9b74
Add basic NOTES.txt (#482) 2024-03-27 04:32:36 -07:00
Lari Hotari
cc0a1acf22
Disable functions by default in values.yaml (#483) 2024-03-26 23:17:40 +01:00
Lari Hotari
fdec9c69ef
Use podManagementPolicy OrderedReady for Broker sts when Functions are enabled (#474)
* Use podManagementPolicy OrderedReady for Broker sts when Functions are enabled

* Don't change podManagementPolicy when the sts already exists

* Fix template issue

* Fix apiVersion
2024-03-26 10:49:33 -07:00
doug-ba
9929b80b3c
add ability to use separate disk for zookeeper tx log (#476)
* add ability to use separate disk for zookeeper tx log

* Use absolute path

---------

Co-authored-by: Lari Hotari <lhotari@users.noreply.github.com>
2024-03-26 07:51:31 -07:00
Lari Hotari
eb0a878d9c
Make job.ttl.enabled consistent and effective only when k8s >= 1.23 (#481) 2024-03-26 06:23:15 -07:00
doug-ba
bc5862d4b0
pulsar-manager adding support for existing secret (#478) 2024-03-26 05:26:37 -07:00
doug-ba
3dee8dfe3b
making .ReleaseIsInstall optional for init jobs (#480)
* making .ReleasIsInstall optional for init jobs

* initialize simplifying an if condition based on feedback
2024-03-25 22:26:32 -07:00
Lari Hotari
43ed6f5434 Chart: Bump version to 3.3.1 2024-03-15 14:31:23 +02:00
Heesung Sohn
7eb8ce0ff3
Bump appVersion to 3.0.3 (#469) 2024-03-10 08:37:17 +02:00
Nathan Clayton
b4241f984b
Update broker statefulset to check if AWS keys secret name is defined before adding to environment. (#466) 2024-03-03 10:38:31 +02:00
Lari Hotari
0b130fafa9
Fix typo in script name in README.md 2024-03-01 05:39:21 -08:00
Lari Hotari
be62fef11c
Add security disclaimer for Helm chart usage 2024-02-29 10:04:03 -08:00
Lari Hotari
aeae9d72e5 Chart: Bump version to 3.3.0 2024-02-23 21:26:19 +02:00
Martin
89c5987b17
Bugfix/pulsar manager init (#463)
* add some more logs to the pulsar manager test

* fix admin secret "double-encoding"

* make pulsar-manager-cluster-initialize.yaml "rerunnable"
2024-02-22 17:37:25 +02:00
Lari Hotari
17a4239733
Remove buggy and useless function-worker-config-map (#462)
Fixes #56
2024-02-21 13:47:23 -08:00
Lari Hotari
0e3251bea8
Remove deprecated "extra" key to configure components, also remove dashboard that has been replaced (#461)
- the "extra" key has been deprecated a long time ago
- the dashboard is outdated and there's a replacement with kube-prometheus-stack and #439
2024-02-21 04:53:29 -08:00
csthomas1
cb269bbaf3
Feature/pulsar manager v0.2.0 with jwt setup admin account creation (#219)
* Added support for JWT secretref and key volume mount. Added admin user auto-creation.

* Removed variables accidentally re-added and comments no longer relevant

* Enabling pulsar manager test w/ manager-admin superuser for symmetric and asymmetric jwt tests

* Added verification of communication with broker to ci test-pulsar-manager

* Fixing error on line 115 of helm.sh

* More fixes

* Adding echo of envs and tenants

* Fixing LOGIN_JSESSIONID variable name
2024-02-21 04:25:23 -08:00
Victor Fauth
29ea17b3fc
Enable persistence for pulsar-manager (#343)
* Enable persistence for pulsar-manager

* Upgrade to v0.4.0 version of pulsar-manager to get required fix

- contains https://github.com/apache/pulsar-manager/pull/501
  in https://github.com/apache/pulsar-manager/releases/tag/v0.4.0

---------

Co-authored-by: Victor Fauth <victor.fauth@thalesgroup.com>
Co-authored-by: Lari Hotari <lhotari@apache.org>
2024-02-15 01:27:40 -08:00
Lari Hotari
ad65ac9941
Prepare scripts for arm64 / aarch64 support (#459)
- GitHub Actions will be adding arm64 support soon
  https://resources.github.com/devops/accelerate-your-cicd-with-arm-and-gpu-runners-in-github-actions/
2024-02-14 23:49:15 -08:00
Lari Hotari
a1cf2ac6ad
Upgrade to recent version of pulsarctl (#458) 2024-02-14 23:25:55 -08:00
Martin
d0b784a953
Feature/pulsar manager initialize (#457)
* add better pulsar manager integration and init along with tests & docs

* fix pulsar manager startup args

* update pulsar manager service to ClusterIP + remove duplicate
2024-02-14 10:13:54 -08:00
Lari Hotari
1f20887f09
Fix kubeconform check and improve it (#456)
- do "helm repo add" for the prometheus-community repo
- run checks for all k8s versions between 1.21.0-1.29.0
2024-02-13 01:43:16 -08:00
Lari Hotari
24b80c1986
Add validation using kubeconform (#449) 2024-01-31 04:21:27 -08:00
Lari Hotari
9cbe03c7ee
Improve Bookkeeper default configuration (#454)
- remove minimal memory settings
- add more optimal data compaction settings
2024-01-31 03:21:04 -08:00
Martin
4daf6d88a2
grouped init containers (#441) 2024-01-26 03:09:57 -08:00
Lari Hotari
8d2d567b30
Remove pulsar_detector dash board (#446)
- not applicable for Apache Pulsar Helm chart's Pulsar deployment
2024-01-26 03:09:11 -08:00
Lari Hotari
72a8fb6b3e
Upgrade kube-prometheus-stack to 56.x.x version (#445)
* Upgrade to kube-prometheus-stack 56.x.x

* Add CI test case for kube-prometheus-stack upgrade

* Add "--force-conflicts" flag
2024-01-26 03:07:10 -08:00
Lari Hotari
727dccb013
Update RELEASE.md 2024-01-25 07:36:51 -08:00
Martin
8cd3a04812
expose admin port of pulsar manager in service (#440) 2024-01-24 23:32:25 -08:00
Lari Hotari
de4d2e7dc8
Add kubeVersion to Chart.yaml to enforce minimum Kubernetes version (#443) 2024-01-24 11:46:59 -08:00
Lari Hotari
65a5fc0002 Fix typo in Apache License 2.0 abbrev, should be AL 2.0 2024-01-24 21:44:24 +02:00
Lari Hotari
d486e4a42d
Add default configuration for Pulsar Grafana dashboards (#439)
* Add default configuration for dashboards
2024-01-24 11:12:57 -08:00
Lari Hotari
a75508862f Update helm version requirement in docs 2024-01-19 20:26:39 +02:00
Lari Hotari
e058aa581d
Require helm version 3.10 or newer (#436)
* Add check for required helm version

* Add test scenario for helm 3.10.0
2024-01-18 19:28:09 +02:00
Lari Hotari
1cb83398c8
Don't use TLS from function instances to brokers by default (#435)
- Function instances don't currently have the TLS CA cert available
2024-01-17 21:04:43 -08:00
Lari Hotari
9461dfc280
Update RELEASE.md 2024-01-17 14:56:41 -08:00
Lari Hotari
aae69e897e
Update README.md
there is no `helm delete`, it is `helm uninstall`
2024-01-17 14:53:28 -08:00
Lari Hotari
584b18ad3c
Update RELEASE.md
Cover gaps in release instructions.
- missed pushing the version bump commit
- release notes creation instructions were missing
2024-01-17 14:51:51 -08:00
Lari Hotari
6db886f078 Chart: Bump version to 3.2.0
(cherry picked from commit 03b3888df449796f815ce90d12a3c64ab661ea30)
2024-01-18 00:45:52 +02:00
Lari Hotari
89602c39e2 Improve functions testing logging 2024-01-17 18:18:32 +02:00
Lari Hotari
23211c998a Fix creating namespace for cert-manager deployment 2024-01-17 18:18:28 +02:00
Lari Hotari
e49bd32378 Fix indent for Tiered storage offload environment 2024-01-17 18:11:30 +02:00
Lari Hotari
e6ccd93d4f
Test Pulsar Functions in CI (#434) 2024-01-17 04:12:37 -08:00
pellicano
cfa156f738
Tiered Storage config (#205)
* Add tiered storage config

* Check Tiered Storage on README

* GitHub PR #205 changes (1st round)

Remove <= 2.6.0 configs.
Add missing GCS secret volumeMount.
Update GCS example name.

* Cleanup comments

* Bump chart version

* GitHub PR #205 changes (2nd round)

Moved storageOffload under broker section.
Fixed some typos.
Added AWS S3 IRSA annotation comment.

* GitHub PR #205  changes (3rd round)

Moved AWS and Azure credentials into K8S secrets using same StreamNative Helm Chart approach.

* Trim trailing spaces

---------

Co-authored-by: Lari Hotari <lhotari@apache.org>
Co-authored-by: Marcelo Pellicano <mpellicanodeoliveira@bluecatnetworks.com>
2024-01-17 03:06:16 -08:00
Lari Hotari
18e67f2bf8 Update RELEASE.md 2024-01-17 12:07:47 +02:00
Lari Hotari
f0844d1d38 Update RELEASE.md 2024-01-17 11:49:07 +02:00
Lari Hotari
0197e0846d Update RELEASE.md 2024-01-17 11:12:55 +02:00
Lari Hotari
5c0d56cdbf
Update RELEASE.md 2024-01-17 01:07:06 -08:00
Lari Hotari
5d1275e71d
Change default value for rbac.limit_to_namespace and functions.rbac.limit_to_namespace (#418) 2024-01-17 01:02:07 -08:00
Lari Hotari
a8c7745b3e
Add testing of upgrading of latest released chart version to CI (#432)
* Add upgrade test to CI

- install latest released chart version and then upgrade to the local chart version

* Add metallb for loadbalancer support so that "--wait" will work

* Improve script logging

* produce messages with old version of pulsar and consume with new version

* Add 10 second delay

* Remove duplication

* Improve logging

* Fix quotes

* Before trying produce-consume test, verify that the Admin API is available

* Add 2 more upgrade scenarios: TLS & PSP
2024-01-16 09:16:16 -08:00
Lari Hotari
f20756abb8
Support configuring "proxyRoles" in broker (#430)
* Add support for proxyRoles

* Test produce and consume via Pulsar proxy
2024-01-16 04:48:58 -08:00
lenglet-k
e54354df87
feat: add externalTrafficPolicy and loadBalancerSourceRanges (#405)
* feat: add externalTrafficPolicy and loadBalancerSourceRanges
2024-01-15 12:59:58 -08:00
lenglet-k
c094322904
feat: add imagePullSecrets in Job (#404)
* feat: add imagePullSecrets on Job

* feat: update values.yaml
2024-01-15 12:28:05 -08:00
Martin
04b8ccebb1
Resource specs for Init Containers (#428)
* add missing section in values.yaml for pulsar_metadata resources

* add resources to all init containers and an additional section to specify them in values.yaml

* increase memory defaults for init containers

* remove empty lines

* Add newline to end of file
2024-01-15 07:53:56 -08:00
Lari Hotari
62569f4023
Fail the chart-testing job if linting fails (#429) 2024-01-15 07:21:35 -08:00
hadican
8061a8b7aa
add loadBalancerIP support for proxy service (#421)
Co-authored-by: Abdulhadi Celenlioglu <abdulhadi@intenseye.com>
2023-12-29 12:16:37 +02:00
Ashok
76fb0bb45c
docs: Update README for PodDisruptionBudget issue during Pulsar upgrade (#420) 2023-12-22 16:48:15 +02:00
Lari Hotari
066b40c040 Fix linting errors 2023-12-21 22:45:46 +02:00
Lari Hotari
0a45f77868 Run CI on pushes to master branch 2023-12-21 19:44:39 +02:00
lenglet-k
eedc21da30
feat: add metricsRelabelings on podMonitor (#406) 2023-12-21 08:24:49 -08:00
Daniel Kovacs
a725188438
feat: added support for tolerations for the init jobs (#399)
Co-authored-by: Daniel Kovacs <daniel.kovacs@directed.global>
2023-12-21 07:48:02 -08:00
Lari Hotari
14c048ee72
Share common parts of the values files used in CI (#415)
* Share common parts of the values files used in CI

* Fix ct-lint
2023-12-21 07:43:25 -08:00
Frank Kelly
0b2d9b4d5d
Decouple Service account creation from PodSecurityPolicy (#387)
* Proposal: service accounts creation should be decoupled from PodSecurityPolicy.

* Rename *-rbac.yaml to *-psp.yaml and move service account to *-service-account.yaml

* Test with psp enabled

Co-authored-by: Lari Hotari <lhotari@apache.org>
2023-12-21 04:40:54 -08:00
Lari Hotari
7bdce5b02c Release note template improvements 2023-12-21 11:49:25 +02:00
Lari Hotari
434de4b298 Add instructions for generating the release notes in GitHub UI 2023-12-21 10:53:32 +02:00
Lari Hotari
ad32dfefc2 Update helm chart index release instructions 2023-12-21 10:39:42 +02:00
Lari Hotari
99380d98d5 Improve clarity of release instructions
- use VERSION_RC and VERSION_WITHOUT_RC that are consistent across
  the instructions
2023-12-21 10:19:54 +02:00
Lari Hotari
d9630564ac
Update RELEASE.md 2023-12-19 08:06:27 -08:00
Lari Hotari
ccf443c267
Update RELEASE.md
Improve chart verification instructions
2023-12-19 07:58:59 -08:00
Lari Hotari
2afd5ce212
Update RELEASE.md
made validation command work for single node clusters
2023-12-19 00:42:19 -08:00
Lari Hotari
2757074763 Update default versions in ct.sh 2023-12-11 14:47:26 +02:00
Lari Hotari
91178e8300 Revisit release process 2023-12-11 14:46:00 +02:00
Lari Hotari
7f84d6e966 Revisit release process 2023-12-11 14:13:11 +02:00
Lari Hotari
a7247b6edb Bump chart version to 3.1.0 2023-12-11 13:32:54 +02:00
Lari Hotari
08bac44c37 Remove RELEASE_NOTES.md
Release notes will be maintained at https://github.com/apache/pulsar-helm-chart/releases
2023-12-11 13:29:29 +02:00
Lari Hotari
8167d22bda
Run CI tests with k8s 1.21 and 1.27 and bump tool versions (#414)
* Run CI tests with k8s v1.21 and v1.27

* Bump versions used in testing
2023-12-11 03:00:27 -08:00
Jasper Vaneessen
89da2b2890
Zookeeper replicas: adhere to own recommendations (#336)
The comments say ZK replicacount should be >=3 but defaults to 1, should adhere to own recommendations by default
2023-12-11 02:36:25 -08:00
Lari Hotari
608b51e872
Bump appVersion to 3.0.2 (#413) 2023-12-11 01:37:34 -08:00
Đình Tuyên
a8d667a391
Correct Keytool env generation (#375) 2023-12-11 01:23:43 -08:00
Ragnar Rova
e349bc54c0
Update common_auth.sh (#243)
Co-authored-by: Lari Hotari <lhotari@users.noreply.github.com>
2023-12-11 01:07:50 -08:00
Michał Koziorowski
fba51bd87e
Lowered BOOKIE_MEM and PULSAR_MEM in init containers (#386)
* Lowered BOOKIE_MEM and PULSAR_MEM in init containers. Default BOOKIE_MEM and PULSAR_MEM settings from conf/pulsar_env.sh and conf/bkenv.sh (-Xms2g -Xmx2g -XX:MaxDirectMemorySize=4g) are too high for low-memory systems.
2023-12-11 00:50:08 -08:00
Julien Jakubowski
d1729e8e0a
fix issue https://github.com/apache/pulsar-manager/issues/505 (#385) 2023-12-11 00:31:56 -08:00
Emre Aydın
9542c7b226
Use container ports for proxy stateful set probes (#410)
Using service ports cause probes to fail.

Co-authored-by: emre <emre.aydin@zapata.ai>
2023-12-11 00:20:07 -08:00
Frank Kelly
8cb3c18377
Allow Proxy and Broker HPA to specify scaling policies on scaleUp or scaleDown. (#391) 2023-09-15 14:12:12 -05:00
Michał Koziorowski
ea5404c421
Fixed bookkeeper volume mounts indentation (#384) 2023-08-24 09:32:58 +08:00
tison
e8a1c08cc2
docs: Update README to reflect unmaintained status (#378) 2023-08-20 23:37:17 +08:00
Ethan-Merrill
73fe688a43
Add support for stateful functions using the bookie as state storage (#171)
### Motivation

Enables support for using the Pulsar bookies as persistent state storage for functions.

### Modifications

- Added an option to enable/disable using bookies as state storage
- Adds extra server components options to the bookkeeper to enable necessary features for bookies to be used as state storage
- Adds stateStorageServiceUrl to the broker configmap
2023-07-18 21:37:03 -05:00
Tomasz Jegorow
042fd5b6d4
Configure custom topologyKey for podAntiAffinity (#351) 2023-07-12 18:19:49 +03:00
Atkins
79ec5ba333
Fix pod annotations when restartPodsOnConfigMapChange is true (#353)
Signed-off-by: Atkins Chang <atkinschang@gmail.com>
2023-07-12 18:18:48 +03:00
Atkins
b30eb6fff8
Improve HPA (#354)
* Use `autoscaling/v2` if Kubernetes version >= 1.23

Signed-off-by: Atkins Chang <atkinschang@gmail.com>

* Disable replicas when autoscaling enabled

Signed-off-by: Atkins Chang <atkinschang@gmail.com>

---------

Signed-off-by: Atkins Chang <atkinschang@gmail.com>
2023-07-12 18:18:19 +03:00
Brad Shelton
f8ad65066e
To address the function role vs clusterrole issue (#236)
* To address the function role vs clusterrole issue

* making backwards compatable

* updated value.yaml to include limit functions to namespace

* Added documentation to clarify the new attribute

* moved limit_to_namespace under functions.rbac
2023-07-12 18:11:36 +03:00
Lari Hotari
49f4acdf5a
Refactor GitHub Actions CI to a single workflow (#371)
* Refactor GitHub Actions CI to a single workflow

* Handle case where "ct lint" fails because of no chart changes

* Re-order scenarios

* Remove excessive default GC logging

* Bump cert-manager version to v1.12.2

* Use compatible cert-manager version

* Install debugging tools (k9s) for ssh access

* Only apply for interactive shells

* Fix JWT symmetric test

* Fix part that was missing from #356

* Install k9s on the fly when k9s is used

- set KUBECONFIG on the fly for kubectl too
2023-07-11 15:55:35 +03:00
huis
2d646f4efe
Fix PVC selector scope error when bookkeeper uses multiple data volumes (#342)
Fix PVC selector scope error when bookkeeper uses multiple data volumes
2023-07-11 10:03:38 +03:00
Robert Moucha
71450334cf
Fix zookeeper annotations (#348)
Fixed the case when no ZK annotations are set and `zookeeper.restartPodsOnConfigMapChange: true`
helm can not render template
2023-07-11 10:01:54 +03:00
mfuxi
786e182de4
add ingressClassName (#360) 2023-07-11 10:00:45 +03:00
Chris Johnson
90a26b2dc8
fix: proxy should not use priviledged port numbers (#356)
* fix: proxy should not use priviledged port numbers

This fixes issue #335

* fix: making the change backward compatible
2023-07-11 10:00:17 +03:00
Lari Hotari
f43c6f6d9e
Fix GitHub Actions based CI checks which have been failing (#370)
* Upgrade upgrade kind, chart releaser and helm versions

* Disable podMonitory for values-broker-tls.yaml file

- was missing from #317

* Use k8s 1.18.20

* Use ubuntu-20.04 runtime

- k8s < 1.19 doesn't support cgroup v2

* Upgrade to k8s 1.19 as baseline

* Baseline to k8s 1.20

* Set ip family to ipv4

* Add more logging to kind cluster creation

* Simplify duplicate job deletion

* use verbosity flag

* Upgrade to k8s 1.24

* Replace removed tolerate-unready-endpoints annotation with publishNotReadyAddresses

(cherry picked from commit e90926053a2b01bb95529fbaddc8d2ce2cdeec63)

* Use k8s 1.21 as baseline

* Run on ubuntu-22.04

* Use Pulsar 2.10.4
2023-07-10 12:45:37 -07:00
Yuwei Sung
b3c19fd7fc
added arm64 in common_auth.sh (#191) 2023-03-14 15:06:34 +08:00
Michael Marshall
8ad7cf6b65
Remove unnecessary version bump guidance 2022-11-03 23:22:32 -05:00
Michael Marshall
9436d03656
Use GitHub release notes until the pulsar.a.o website hosts them 2022-11-03 23:21:03 -05:00
Michael Marshall
bcfe47ced4
Releases are available at downloads.apache.org 2022-11-03 23:03:39 -05:00
Michael Marshall
e49bd36422
Minor changes to release process 2022-11-03 23:02:04 -05:00
Michael Marshall
4dfb96fb36
Add RELEASE_NOTES.md for 3.0.0 Release (#322)
* Add RELEASE_NOTES.txt

* Add section for upgrade considerations

* Minor fixes

* Add license header

# Motivation

As part of the 3.0.0 release, I've prepared release notes. Please review them and suggest improvements.
2022-11-03 16:22:46 -05:00
Michael Marshall
7bcf1af6e5
Revert "Remove unused license test file"
This reverts commit bcbc674092bf2cf5ad93db181a9bbeb75406fc49.
2022-10-28 14:30:42 -05:00
Michael Marshall
34678b8e1b
Clarify Apache Pulsar 2.10.0 upgrade section name 2022-10-28 14:25:56 -05:00
Michael Marshall
c70a7877eb
Minor wording improvements to release process 2022-10-28 14:19:59 -05:00
Michael Marshall
bcbc674092
Remove unused license test file 2022-10-28 14:18:18 -05:00
Michael Marshall
c8f5e7f9ce
New Release Process (#301)
* Copy release process doc from Apache Airflow

Source: fb741fd872/dev/README_RELEASE_HELM_CHART.md

* Adapt to Apache Pulsar

* Remove old release process notes

* Fix typo

* Apply suggestions from code review

Co-authored-by: tison <wander4096@gmail.com>

* Add sign.sh script for release artifacts

Script is copied from 395ad7110e/dev/sign.sh

* Add some updates (more to might follow)

* Add some more updates to the rest of the release plan

* Fix rat check command

Co-authored-by: tison <wander4096@gmail.com>

Relates to #290

### Motivation

Make the Apache Pulsar Helm Chart release follow ASF rules for voting, and make the helm binary available via dist.apache.org. By following the information in https://issues.apache.org/jira/browse/LEGAL-573 and in the Apache Airflow project https://github.com/apache/airflow/blob/main/dev/README_RELEASE_HELM_CHART.md, I built this new release process. It will likely need some iterative improvement.

### Modifications

* Add a release process that is based on the Apache Airflow release process

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-21 00:33:08 -05:00
Michael Marshall
687060aa27
Chart: Bump version to 3.0.0 2022-10-21 00:26:42 -05:00
Michael Marshall
8072c38ecc
Document Grafana Dashboards to prepare for 3.0.0 release (#321) 2022-10-21 08:24:30 +03:00
Michael Marshall
f4cb7a2c95
Simplify deployment instructions in README (#324)
Fixes #287

### Motivation

The current steps to install the Apache Pulsar Helm Chart include an unnecessary script `scripts/pulsar/prepare_helm_release.sh`. It relies on tooling that has not been maintained and is not a part of the Apache Pulsar project. As such, I propose we remove these references.

Note that one of the reasons we used these scripts historically is to simplify deployment. Without these scripts, we should document what is necessary. I am tracking that work here https://github.com/apache/pulsar-helm-chart/issues/323.
2022-10-21 00:23:32 -05:00
edward.zeng
95c218b218
Fix PodMonitor name conflicts for multiple releases in same namespace (#258)
* Fix PodMonitor name conflicts for multiple releases in same namespace

Signed-off-by: Edward Zeng <jie.zeng@zilliz.com>

* Use pulsar.fullname for PodMonitor name prefix

Signed-off-by: Edward Zeng <jie.zeng@zilliz.com>
Co-authored-by: Michael Marshall <mmarshall@apache.org>

Signed-off-by: Edward Zeng <jie.zeng@zilliz.com>

Fixes #257

### Motivation

Fix PodMonitor name conflicts for multiple releases in same namespace

### Modifications

Use release name instead of hardcode `pulsar.name` for pod monitor name.

### Verifying this change

- [x] Make sure that the change passes the CI checks.
2022-10-20 21:15:16 -05:00
Michael Marshall
d9769a9519
Add missing license headers and .rat-excludes (#319)
* Add missing license headers and .rat-excludes

* Fix .rat-excludes files

### Motivation

As part of our updated release process, we need to make sure that all relevant files have license headers.

### Modifications

* Add license headers formatted appropriately for each file type

### Verifying this change

The follow script shows that the solution is complete:

```shell
$ java -jar ../apache-rat-0.15/apache-rat-0.15.jar . -E .rat-excludes 
Ignored 18 lines in your exclusion files as comments or empty lines.


*****************************************************
Summary
-------
Generated at: 2022-10-20T17:54:42-05:00

Notes: 4
Binaries: 1
Archives: 0
Standards: 92

Apache Licensed: 92
Generated Documents: 0

JavaDocs are generated, thus a license header is optional.
Generated files do not require license headers.

0 Unknown Licenses

*****************************************************
  Files with Apache License headers will be marked AL
  Binary files (which do not require any license headers) will be marked B
  Compressed archives will be marked A
  Notices, licenses etc. will be marked N
  AL    ./.asf.yaml
  AL    ./.rat-excludes
  N     ./LICENSE
  N     ./NOTICE
  AL    ./README.md
  AL    ./Vagrantfile
  AL    ./license_test.go
  AL    ./charts/pulsar/.helmignore
  AL    ./charts/pulsar/Chart.yaml
  N     ./charts/pulsar/LICENSE
  N     ./charts/pulsar/NOTICE
  AL    ./charts/pulsar/values.yaml
  B     ./charts/pulsar/charts/kube-prometheus-stack-41.5.1.tgz
  AL    ./charts/pulsar/templates/_autorecovery.tpl
  AL    ./charts/pulsar/templates/_bookkeeper.tpl
  AL    ./charts/pulsar/templates/_broker.tpl
  AL    ./charts/pulsar/templates/_configurationstore.tpl
  AL    ./charts/pulsar/templates/_helpers.tpl
  AL    ./charts/pulsar/templates/_toolset.tpl
  AL    ./charts/pulsar/templates/_zookeeper.tpl
  AL    ./charts/pulsar/templates/autorecovery-configmap.yaml
  AL    ./charts/pulsar/templates/autorecovery-podmonitor.yaml
  AL    ./charts/pulsar/templates/autorecovery-rbac.yaml
  AL    ./charts/pulsar/templates/autorecovery-service.yaml
  AL    ./charts/pulsar/templates/autorecovery-statefulset.yaml
  AL    ./charts/pulsar/templates/bookkeeper-cluster-initialize.yaml
  AL    ./charts/pulsar/templates/bookkeeper-configmap.yaml
  AL    ./charts/pulsar/templates/bookkeeper-pdb.yaml
  AL    ./charts/pulsar/templates/bookkeeper-podmonitor.yaml
  AL    ./charts/pulsar/templates/bookkeeper-rbac.yaml
  AL    ./charts/pulsar/templates/bookkeeper-service.yaml
  AL    ./charts/pulsar/templates/bookkeeper-statefulset.yaml
  AL    ./charts/pulsar/templates/bookkeeper-storageclass.yaml
  AL    ./charts/pulsar/templates/broker-cluster-role-binding.yaml
  AL    ./charts/pulsar/templates/broker-configmap.yaml
  AL    ./charts/pulsar/templates/broker-hpa.yaml
  AL    ./charts/pulsar/templates/broker-pdb.yaml
  AL    ./charts/pulsar/templates/broker-podmonitor.yaml
  AL    ./charts/pulsar/templates/broker-rbac.yaml
  AL    ./charts/pulsar/templates/broker-service-account.yaml
  AL    ./charts/pulsar/templates/broker-service.yaml
  AL    ./charts/pulsar/templates/broker-statefulset.yaml
  AL    ./charts/pulsar/templates/dashboard-deployment.yaml
  AL    ./charts/pulsar/templates/dashboard-ingress.yaml
  AL    ./charts/pulsar/templates/dashboard-service.yaml
  AL    ./charts/pulsar/templates/function-worker-configmap.yaml
  AL    ./charts/pulsar/templates/keytool.yaml
  AL    ./charts/pulsar/templates/namespace.yaml
  AL    ./charts/pulsar/templates/proxy-configmap.yaml
  AL    ./charts/pulsar/templates/proxy-hpa.yaml
  AL    ./charts/pulsar/templates/proxy-ingress.yaml
  AL    ./charts/pulsar/templates/proxy-pdb.yaml
  AL    ./charts/pulsar/templates/proxy-podmonitor.yaml
  AL    ./charts/pulsar/templates/proxy-rbac.yaml
  AL    ./charts/pulsar/templates/proxy-service.yaml
  AL    ./charts/pulsar/templates/proxy-statefulset.yaml
  AL    ./charts/pulsar/templates/pulsar-cluster-initialize.yaml
  AL    ./charts/pulsar/templates/pulsar-manager-admin-secret.yaml
  AL    ./charts/pulsar/templates/pulsar-manager-configmap.yaml
  AL    ./charts/pulsar/templates/pulsar-manager-deployment.yaml
  AL    ./charts/pulsar/templates/pulsar-manager-ingress.yaml
  AL    ./charts/pulsar/templates/pulsar-manager-service.yaml
  AL    ./charts/pulsar/templates/tls-cert-internal-issuer.yaml
  AL    ./charts/pulsar/templates/tls-certs-internal.yaml
  AL    ./charts/pulsar/templates/toolset-configmap.yaml
  AL    ./charts/pulsar/templates/toolset-rbac.yaml
  AL    ./charts/pulsar/templates/toolset-service.yaml
  AL    ./charts/pulsar/templates/toolset-statefulset.yaml
  AL    ./charts/pulsar/templates/zookeeper-configmap.yaml
  AL    ./charts/pulsar/templates/zookeeper-pdb.yaml
  AL    ./charts/pulsar/templates/zookeeper-podmonitor.yaml
  AL    ./charts/pulsar/templates/zookeeper-rbac.yaml
  AL    ./charts/pulsar/templates/zookeeper-service.yaml
  AL    ./charts/pulsar/templates/zookeeper-statefulset.yaml
  AL    ./charts/pulsar/templates/zookeeper-storageclass.yaml
  AL    ./examples/values-bookkeeper-aws.yaml
  AL    ./examples/values-cs.yaml
  AL    ./examples/values-jwt-asymmetric.yaml
  AL    ./examples/values-jwt-symmetric.yaml
  AL    ./examples/values-local-cluster.yaml
  AL    ./examples/values-local-pv.yaml
  AL    ./examples/values-minikube.yaml
  AL    ./examples/values-no-persistence.yaml
  AL    ./examples/values-one-node.yaml
  AL    ./examples/values-tls.yaml
  AL    ./examples/values-zookeeper-aws.yaml
  AL    ./hack/common.sh
  AL    ./hack/kind-cluster-build.sh
  AL    ./scripts/set-pulsar-version.sh
  AL    ./scripts/cert-manager/install-cert-manager.sh
  AL    ./scripts/pulsar/cleanup_helm_release.sh
  AL    ./scripts/pulsar/common.sh
  AL    ./scripts/pulsar/common_auth.sh
  AL    ./scripts/pulsar/generate_token.sh
  AL    ./scripts/pulsar/generate_token_secret_key.sh
  AL    ./scripts/pulsar/get_token.sh
  AL    ./scripts/pulsar/prepare_helm_release.sh
 
*****************************************************

```
2022-10-20 20:29:09 -05:00
Michael Marshall
a963e736fc
Improve documentation and testing for PodMonitors (#317)
* Imrpove documentation and testing for PodMonitors

* Fix missed references and a typo

### Motivation

Before upgrading to 3.0.0, we want to make sure the kube-prometheus-stack is well documented. 

### Modifications

* Update tests and examples to fully disable `PodMonitors` and the installation of the kube-prometheus-stack CRDs.

### Verifying this change

The current tests will cover these changes.
2022-10-20 17:40:47 -05:00
Michael Marshall
35090ec822
Include LICENSE and NOTICE in distribution 2022-10-20 15:48:07 -05:00
Michael Marshall
f509bc80ea
Add NOTICE file 2022-10-20 15:42:33 -05:00
Michael Marshall
49d345b6a3
Add LICENSE file before distributing source (#318)
### Motivation

In order to update the release process, we need to have a LICENSE file in the root directory. See https://www.apache.org/legal/release-policy.html#license-file and https://www.apache.org/legal/release-policy.html#full-copy-for-each-source-file.

### Modifications

* Copied the LICENSE file from the apache/pulsar repo
2022-10-20 15:39:20 -05:00
Michael Marshall
9324a9a270
Fix bookkeeper metadata init when specifying metadataPrefix (#316)
Fixes #309

### Motivation

Fix the metadataPrefix initialization.

### Modifications

* Fix the script by adding `&& echo`

### Verifying this change

I manually verified that this change works and correctly puts the metadata in the prefixed location.
2022-10-20 15:24:20 -05:00
Claudio Vellage
343ce0527d
Allow to use selectors with volumeClaimTemplates (#286)
* Allow to use selectors with volumeClaimTemplates

* Fixed naming inconsistency, added null value

Co-authored-by: Claudio Vellage <claudio.vellage@pm.me>
Co-authored-by: Michael Marshall <mmarshall@apache.org>

### Motivation

Currently it's not possible to use selectors with volumeClaimTemplates which makes it hard/impossible to bind statically provisioned PVs.

### Modifications

Added (optional) selectors to `volumeClaimTemplates` and documented in values file.

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-20 13:46:23 -05:00
Michael Marshall
1e8491aebd
Fix CI by modifying Chart.yaml and updating ct lint command (#315)
### Motivation

Fix the CI lint step by modifying the Chart.yaml and by removing the maintainers validation step.
2022-10-20 13:17:51 -05:00
Michael Marshall
a41fbb2582
Do not require version bump (#314)
* [CI] Do not require version bump when linting

* Fix formatting

### Motivation

With #292, we made the lint CI step require chart version bumps. That is an unnecessary requirement since we have a manual release process. Also, we didn't require it previously.

### Modifications

* Disable chart version bump

### Verifying this change

This is a trivial change.
2022-10-20 00:12:38 -05:00
Samuel Verstraete
8f033bd1a5
allow specifying the nodeSelector for the init jobs (#225)
* allow specifying the nodeSelector for the init jobs

* Use pulsar_metadata.nodeSelector

Co-authored-by: samuel <samuel.verstraete@aprimo.com>

### Motivation

When deploying pulsar to an AKS cluster with windows nodepools i was unable to specify that the Jobs of the initalize release had to run on linux nodes. With the change i can now specify a node selector for the init jobs.

### Modifications

add nodeSelector on pulsar_init and bookie_init

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-19 23:41:39 -05:00
Michael Marshall
2410743cdb
[test] Add a consumer to the helm tests (#312)
### Motivation

The current tests only produce a message. This test adds a consumer for the produced message.

### Modifications

* Add new section to the test where we consume the produced message
2022-10-19 23:38:42 -05:00
JiangHaiting
da6ce85c66
Bump 2.10.2 (#310)
### Motivation

Bump Apache Pulsar 2.10.2


### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-19 22:51:08 -05:00
Michael Marshall
bd00842800
Fix monitoring configuration broken by #299 (#313)
Related to #311

### Motivation

In #299, I updated the values without also updating the test values. As a result, I unintentionally enabled the monitoring stack in the tests and broke some examples. Because we are deploying all resources to a single node. It is possible that we are resource constrained, so I am going to re-disable the monitoring stack.

### Modifications

* Update test cluster configurations to re-disable deploying the monitoring stack
* Update examples with the new configuration

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-19 22:50:31 -05:00
Michael Marshall
3ef2d80dec
Upgrade to Cert Manager 1.7.3 (#307)
* Upgrade to Cert Manager 1.10.0

* Fail fast when installing cert manager

* Upgrade to 1.7.3

Here is the relevant documentation for k8s compatibility:
https://cert-manager.io/docs/installation/supported-releases/

### Motivation

The current version is out of date.

### Modifications

* Upgrade from 1.5.4 to 1.7.3

### Verifying this change

Once #306 is merged, the test suite will verify this PR.
2022-10-19 16:29:19 -05:00
Michael Marshall
42ce7caa55
Update how to configure external zookeeper servers (#308)
### Motivation

In #269, we added a way to configure external zookeeper servers. However, it was added to the wrong section of the zookeeper config. The `zookeeper.configData` section is mapped directly into the zookeeper configmap.

### Modifications

Move `zookeeper.configData.ZOOKEEPER_SERVERS` to `zookeeper.externalZookeeperServerList`

### Verifying this change
This is a cosmetic change on an unreleased feature.
2022-10-19 16:28:33 -05:00
tison
fd71b46b1a
Replace handmade lint script with official action (#292)
* replace homemade release script with official action

Signed-off-by: tison <wander4096@gmail.com>

* bundle helm/chart-releaser-action

Signed-off-by: tison <wander4096@gmail.com>

* update .asf.yaml

Signed-off-by: tison <wander4096@gmail.com>

* fix helm/chart-testing-action is not allowed

Signed-off-by: tison <wander4096@gmail.com>

* try azure/setup-helm is allowed

Signed-off-by: tison <wander4096@gmail.com>

* Revert "try azure/setup-helm is allowed"

This reverts commit 7ee6fc0b3d4584127568fe607732b9c3aa70f031.

* replace handmade lint script with official action

Signed-off-by: tison <wander4096@gmail.com>

Signed-off-by: tison <wander4096@gmail.com>
2022-10-19 15:34:22 -05:00
Michael Marshall
7f23af26b7
Replace monitoring solution with kube-prometheus-stack dependency (#299)
* Replace monitoring solution with kube-prometheus-stack dependency

* Enable pod monitors

* Download necessary chart dependencies for CI

* Actually run dependency update

* Enable missed podMonitor

* Disable alertmanager by default for feature parity

Related issues #294 #65

Supersedes #296 and #297

### Motivation

Our helm chart is out of date. I propose we make a breaking change for the monitoring solution and start using the `kube-prometheus-stack` as a dependency. This should make upgrades easier and will let users leverage all of that chart's features.

This change will result in the removal of the StreamNative Grafana Dashboards. We'll need to figure out the right way to address that. The apache/pulsar project has grafana dashboards, but they have not been maintained. With this added dependency, we'll have the benefit of being able to use k8s `ConfigMap`s to configure grafana dashboards.

### Modifications

* Remove old prometheus and grafana configuration
* Add kube-prometheus-stack chart as a dependency
* Enable several components by default. I am not opinionated on these, but it is based on the other values in the chart.

### Verifying this change

This is a large change that will require manual validation, and may break deployments. I propose this triggers a helm chart 3.0.0 release.
2022-10-19 10:23:08 -05:00
Michael Marshall
62a0d2b8a4
Use cert-manager to generate certs for tests (#306)
* Use cert-manager to generate certs for tests

* Install Cert-Manager in test env

### Motivation

Currently, we use hard coded certificates for the tests. Instead, we can use Cert Manager to generate the certificates. The primary benefit of this change is that it ensure we're testing the cert manager integration.

### Modifications

* Remove `.ci/tls` directory since we no longer need these certs.
* Remove `scripts/pulsar/clean_tls.sh` (it wasn't used)
* Remove `scripts/pulsar/upload_tls.sh` since we are not uploading any certs
* Update the `helm.sh` test script
* Update the `.ci/clusters` configurations to generate the relevant cert manager manifests

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-19 10:22:22 -05:00
Yuwei Sung
816d88c942
added pdb version detection (#260)
* added pdb version detection

* refresh

* Update bookkeeper-pdb.yaml

update the capabilities syntax

* Update broker-pdb.yaml

update capability syntax

* Update proxy-pdb.yaml

update capability version syntax

* Update zookeeper-pdb.yaml

update capability version syntax

* Update zookeeper-pdb.yaml

fix typo

* Update bookkeeper-pdb.yaml

Co-authored-by: Marvin Cai <cai19930303@gmail.com>

Fixes pod disruption budget version warning

### Motivation

PDB policy api version, v1beta1 is deprecated in k8s1.21+ (not available in 1.25+).

### Modifications

zookeeper-pdb, proxy-pdb, broker-pdb and bookkeepr-pdb templates are modified.  If k8s api-resources container policy/v1, the *-pdb.yaml will generate respective apiVersion. 

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-18 22:52:11 -05:00
Rajan Dhabalia
89f28bca9c
Support mechanism to provide external zookeeper-server list to build global/configuration zookeeper (#269)
* Support mechanism to provide external zookeeper-server list to build global/configuration zookeeper

* Add external zk example

* add external zk list into values.yaml

Fixes #268

### Motivation
Right now, [chart dynamically](https://github.com/apache/pulsar-helm-chart/blob/master/charts/pulsar/templates/zookeeper-statefulset.yaml#L140) creates zk cluster with zk pods initialized in the same namespace. However, for global/configuration zookeeper, user requires to build zk clusters with pods deployed in different namespaces. Therefore, user needs a mechanism to pass an external list of zk-servers to the chart and build zk-cluster with pods across different namespaces.

### Modification
- Chart should be considering zk-value's configuration for external zookeeper and generate zk-configuration file with appropriate zk-server list and unique id of that zookeeper.

This PR sets `ZOOKEEPER_SERVERS` value provided by user and also sets override-value flag which will be used by [generate-zookeeper-config.sh](https://github.com/apache/pulsar/blob/master/docker/pulsar/scripts/generate-zookeeper-config.sh) to override external zk list in config file and assign appropriate id to the host.

https://github.com/apache/pulsar/pull/15987 fixes [generate-zookeeper-config.sh](https://github.com/apache/pulsar/blob/master/docker/pulsar/scripts/generate-zookeeper-config.sh) changes.


### Result
- User can add `ZOOKEEPER_SERVERS` string into `zookeeper.configData` in [Values.yaml](https://github.com/apache/pulsar-helm-chart/blob/master/charts/pulsar/values.yaml#L385) file to override external zk-server list.
2022-10-18 17:41:43 -05:00
Stepan Mazurov
1bcf255e12
feat(certs): use actual v1 spec for certs (#233)
Co-authored-by: Stepan Mazurov <smazurov@quantummetric.com>

### Motivation

In #204, api version of the cert resources was updated to v1. This was insufficient because `v1` has different spec from `v1alpha1` 

This MR finishes the work that #204 and @lhotari started.

### Modifications

Changed the spec of certs to match v1 cert manager spec.

### Verifying this change

- [ ] Make sure that the change passes the CI checks.
2022-10-18 15:40:43 -05:00
Penghui Li
8f1ca065b3
Bump Apache Pulsar 2.10.1 (#274)
* Bump Apache Pulsar 2.10.1

* Do not bump .Chart.version

* Remove unnecessary jq download that was failing with Permission Denied

Co-authored-by: Michael Marshall <mmarshall@apache.org>
2022-10-18 13:16:51 -05:00
Michael Marshall
58cd43fe8b
Remove '|| yes' in bk cluster init script (#305) 2022-10-18 18:46:07 +03:00
Michael Marshall
48501ebe84
Allow bk cluster init to restart on failure (#303)
### Motivation

This is essentially the same as https://github.com/apache/pulsar-helm-chart/pull/176. Without this change, an init pod can fail and be in `Error` state even though the second pod succeeded. This will prevent misleading errors.

### Modifications

* Replace `Never` with `OnFailure`

### Verifying this change

This is a trivial change.
2022-10-17 17:59:05 -05:00
Lari Hotari
25f355e6e2
Use appVersion as default tag for Pulsar images (#200)
Co-authored-by: Michael Marshall <mmarshall@apache.org>

### Motivation

There was a suggestion [in a dev mailing list discussion](https://lists.apache.org/thread/bgkvcyt1qq6h67p2k8xwp89xlncbqn3d) that the Helm chart's appVersion should be used as the default image tag.

### Additional context

There are some limitations in Helm. It is not possible to set "appVersion" from the command line. There's in an open feature request https://github.com/helm/helm/issues/8194 to add such a feature to Helm.

### Modifications

- change default values.yaml and set the tags for the images that use the Pulsar image to an empty value
- add "defaultPulsarImageTag" to values.yaml
- add a helper template "pulsar.imageFullName" that contains the logic to fall back to .Values.defaultPulsarImageTag and if it's not set, falling back to .Chart.AppVersion
- use the helper template in all other templates that require the logic
2022-10-17 15:42:58 -05:00
Michael Marshall
6a00845670
Remove GitHub Action Workflows that release the chart (#300)
Relates to: https://github.com/apache/pulsar-helm-chart/issues/290

### Motivation

We should not use GitHub Actions to release the helm chart. As such, we can remove the relevant workflow code from this repo while we build the relevant process to officially release the helm chart.

The main risk with this kind of change is that we won't have a way to "release" the chart. However, it is relevant to point out that we have not had any official releases of the chart given that the PMC has not been voting on the releases. I think we need to prioritize fixing this process as a community.

### Modifications

* Remove all scripts and configuration files that enabled GitHub Actions to release the helm chart.

### Verifying this change

This is a trivial change.
2022-10-17 14:39:04 -05:00
Arnar
f3ba780ab5
Alphabetically sort list of super users (#291)
Fixes #288 

### Motivation

When specifying multiple roles in `.Values.auth.superUsers` the values are converted to a comma-separated list by piping the dict through `values` and `join` in helm templating, `values` however doesn't guarantee that the order of elements will be the same every time. Therefor it recommends also passing it through `sortAlpha` to sort the list alphabetically.

This is a problematic when `.Values.broker.restartPodsOnConfigMapChange` is enabled because the checksum of the configmap changes every time the list's order is changed, resulting in the statefulsets rolling out a new version of the pods.

### Modifications

Pass list through `sortAlpha`.

### Verifying this change

- [x] Make sure that the change passes the CI checks.
2022-10-17 14:36:22 -05:00
Michael Marshall
20c55022df
Only send notifications to commits@ ML (#302)
This PR modifies the Apache mailing list notifications so that commits, issues, and pull request notifications are sent to the commits@pulsar.apache.org mailing list. If you would like these notifications, please to subscribe to the commits mailing list or use the GitHub "watch" feature.

Mailing list discussion for this change: https://lists.apache.org/thread/j6y57kr4180xblh7voyrjw47blgmghwt
2022-10-17 14:12:21 -05:00
Aliaksandr Shulyak
8b42a61f2e
Add nodeSelector to cluster initialize pod (#284)
* Add nodeSelector to cluster initialize pod

* Add option to values file

* Update charts/pulsar/templates/pulsar-cluster-initialize.yaml

Co-authored-by: Michael Marshall <mikemarsh17@gmail.com>

* Fix typo in values

Co-authored-by: Michael Marshall <mikemarsh17@gmail.com>

### Motivation

Add an option to choose where to run pulsar-cluster-initialize pod. Sometimes there is a necessity to run only on certain nodes.

### Modifications

Added nodeSelector option to the pulsar-cluster-initialize job.
2022-10-14 13:44:47 -05:00
Michael Marshall
9e10d1ff6d
Update README.md links to Pulsar Docs (#298)
### Motivation

Some of the links in the README are out of date. This PR fixes the ones that I found. Note that the ones with `/en` were not technically broken.
2022-10-13 21:17:28 -05:00
Qiang Zhao
465d1726e2
Bump Apache Pulsar version to 2.9.3 (#277) 2022-07-18 23:24:46 +08:00
Paul Gier
a2d3f3ef41
scripts: provide an error if the namespace was not created (#276)
Signed-off-by: Paul Gier <paul.gier@datastax.com>

This is just a minor improvement to the error handling of one of the bash scripts

### Motivation

Currently if you run `./scripts/pulsar/prepare_helm_release.sh` and the pulsar namespace does not currently exist, you get several error messages that make it not that clear what still needs to be done next.

```
generate the token keys for the pulsar cluster
The private key and public key are generated to /var/folders/cn/r5tb0zln1bgbfzz_7x72tgzm0000gn/T/tmp.ITrq1a4C and /var/folders/cn/r5tb0zln1bgbfzz_7x72tgzm0000gn/T/tmp.qi0dl2WO successfully.
error: failed to create secret namespaces "pulsar" not found
generate the tokens for the super-users: proxy-admin,broker-admin,admin
generate the token for proxy-admin
pulsar-dev-token-asymmetric-key
kubectl get -n pulsar secrets pulsar-dev-token-asymmetric-key -o jsonpath={.data.PRIVATEKEY} | base64 --decode > /var/folders/cn/r5tb0zln1bgbfzz_7x72tgzm0000gn/T/tmp.CikEhIxe
Error from server (NotFound): namespaces "pulsar" not found
generate the token for broker-admin
pulsar-dev-token-asymmetric-key
kubectl get -n pulsar secrets pulsar-dev-token-asymmetric-key -o jsonpath={.data.PRIVATEKEY} | base64 --decode > /var/folders/cn/r5tb0zln1bgbfzz_7x72tgzm0000gn/T/tmp.G1PU9MMj
Error from server (NotFound): namespaces "pulsar" not found
generate the token for admin
pulsar-dev-token-asymmetric-key
kubectl get -n pulsar secrets pulsar-dev-token-asymmetric-key -o jsonpath={.data.PRIVATEKEY} | base64 --decode > /var/folders/cn/r5tb0zln1bgbfzz_7x72tgzm0000gn/T/tmp.HddlCq8e
Error from server (NotFound): namespaces "pulsar" not found
-------------------------------------

The jwt token secret keys are generated under:
    - 'pulsar-dev-token-asymmetric-key'

The jwt tokens for superusers are generated and stored as below:
    - 'proxy-admin':secret('pulsar-dev-token-proxy-admin')
    - 'broker-admin':secret('pulsar-dev-token-broker-admin')
    - 'admin':secret('pulsar-dev-token-admin')
```

### Modifications

I added a check for the existence of the namespace which fails immediately instead of continuing, and added an error message that describes what the problem is and how to resolve it.

```
error: failed to get namespace 'pulsar'
please check that this namespace exists, or use the '-c' option to create it
```

### Verifying this change

- [X] Make sure that the change passes the CI checks.
2022-07-13 21:38:50 -05:00
Michael Marshall
26bc26028b
Use https to get Apache Pulsar icon in Chart.yaml 2022-06-26 00:39:09 -05:00
HuynhKevin
3c59b43f28
Add imagePullSecrets zookeeper (#244)
* Add imagePullSecrets for zookeeper

* Add imagePullSecrets for zookeeper

Co-authored-by: Kevin Huynh <khuynh@littlebigcode.fr>

All components have the imagePullSecrets to avoid quota limit to init correctly the pods except zookeeper
2022-06-26 00:01:48 -05:00
Filipe Caixeta
c05f659ff4
make proxy httpNumThreads configurable (#251)
Fixes https://github.com/apache/pulsar-helm-chart/issues/250

### Motivation

`httpNumThreads` is hardcoded to 8 in `charts/pulsar/templates/proxy-configmap.yaml`
When trying to override in `values.yaml` by using `proxy.configData.httpNumThreads` we get an error because the keys get duplicated.
This happens because `{{ toYaml .Values.proxy.configData | indent 2 }}` doesn't deduplicate the keys and there is no other way to set `httpNumThreads`

### Modifications

Removing the key from charts/pulsar/templates/proxy-configmap.yaml and adding it to the values yaml solves the problem.

### Verifying this change

- [x] Make sure that the change passes the CI checks.
2022-06-25 23:57:30 -05:00
Yong Zhang
6afab51bad
Upgrade the pulsar manager image version to 0.3.0 (#271)
---

**Motivation**

The pulsar manager released 0.3.0, we can upgrade it in our charts.
2022-06-25 23:52:20 -05:00
Marvin Cai
c6ab1d18e3
Support defining extra env for broker and proxy statefulsset. (#273) 2022-06-20 07:59:43 -07:00
Yong Zhang
f2266c4295
Enable the pulsar manager in the minikube values (#270)
---

Fixes: https://github.com/apache/pulsar/issues/15927

### Motivation

We have documented the using pulsar manager in the Getting started
with helm in the pulsar website. We should enable the pulsar manager
by default in the minikube values.

### Modifications

- enable the pulsar manager by default in the minikube values.
2022-06-15 09:42:16 +08:00
Michael Marshall
428736c788
Add bk, zk securityContext to support upgrade to non-root docker image (#266)
Master Issue: https://github.com/apache/pulsar/issues/11269

### Motivation

Apache Pulsar's docker images for 2.10.0 and above are non-root by default. In order to ensure there is a safe upgrade path, we need to expose the `securityContext` for the Bookkeeper and Zookeeper StatefulSets. Here is the relevant k8s documentation on this k8s feature: https://kubernetes.io/docs/tasks/configure-pod-container/security-context.

Once released, all deployments using the default `values.yaml` configuration for the `securityContext` will pay a one time penalty on upgrade where the kubelet will recursively chown files to be root group writable. It's possible to temporarily avoid this penalty by setting `securityContext: {}`.

### Modifications

* Add config blocks for the `bookkeeper.securityContext` and `zookeeper.securityContext`.
* Default to `fsGroup: 0`. This is already the default group id in the docker image, and the docker image assumes the user has root group permission.
* Default to `fsGroupChangePolicy: "OnRootMismatch"`. This configuration will work for all deployments where the user id is stable. If the user id switches between restarts, like it does in OpenShift, please set to `Always`.
* Remove gc configuration writing to directory that the user lacks permission. (Perhaps we want to write to `/pulsar/log/bookie-gc.log`?) 
* Add documentation to the README.

### Verifying this change

I first attempted verification of this change with minikube. It did not work because minikube uses hostPath volumes by default. I then tested on EKS v1.21.9-eks-0d102a7. I tested by deploying the current, latest version of the helm chart (2.9.3) and then upgrading to this PR's version of the helm chart along with using the 2.10.0 docker image. I also tested upgrading from a default version 

Test 1 is a plain upgrade using the default 2.9.3 version of the chart, then upgrading to this PR's version of the chart with the modification to use the 2.10.0 docker images. It worked as expected.

```bash
$ helm install test apache/pulsar
$ # Wait for chart to deploy, then run the following, which uses Pulsar version 2.10.0:
$  helm upgrade test -f charts/pulsar/values.yaml charts/pulsar/
```

Test 2 is a plain upgrade using the default 2.9.3 version of the chart, then an upgrade to this PR's version of the chart, then an upgrade to this PR's version of the chart using 2.10.0 docker images. There is a minor error described in the `README.md`. The solution is to chown the bookie's data directory.

```bash
$ helm install test apache/pulsar
$ # Wait for chart to deploy, then run the following, which uses Pulsar version 2.9.2:
$  helm upgrade test -f charts/pulsar/values.yaml charts/pulsar/
$ # Upgrade using Pulsar version 2.10.0
$  helm upgrade test -f charts/pulsar/values.yaml charts/pulsar/
```

### GC Logging

In my testing, I ran into the following errors when using `-Xlog:gc:/var/log/bookie-gc.log`:

```
pulsar-bookkeeper-verify-clusterid [0.008s] Error opening log file '/var/log/bookie-gc.log': Permission denied
pulsar-bookkeeper-verify-clusterid [0.008s] Initialization of output 'file=/var/log/bookie-gc.log' using options '(null)' failed.
pulsar-bookkeeper-verify-clusterid [0.005s] Error opening log file '/var/log/bookie-gc.log': Permission denied
pulsar-bookkeeper-verify-clusterid [0.006s] Initialization of output 'file=/var/log/bookie-gc.log' using options '(null)' failed.
pulsar-bookkeeper-verify-clusterid Invalid -Xlog option '-Xlog:gc:/var/log/bookie-gc.log', see error log for details.
pulsar-bookkeeper-verify-clusterid Error: Could not create the Java Virtual Machine.
pulsar-bookkeeper-verify-clusterid Error: A fatal exception has occurred. Program will exit.
pulsar-bookkeeper-verify-clusterid Invalid -Xlog option '-Xlog:gc:/var/log/bookie-gc.log', see error log for details.
pulsar-bookkeeper-verify-clusterid Error: Could not create the Java Virtual Machine.
pulsar-bookkeeper-verify-clusterid Error: A fatal exception has occurred. Program will exit.
```

I resolved the error by removing the setting.

### OpenShift Observations

I wanted to seamlessly support OpenShift, so I investigated using configuring the bookkeeper and zookeeper process with `umask 002` so that they would create files and directories that are group writable (OpenShift has a stable group id, but gives the process a random user id). That worked for most tools when switching the user id, but not for RocksDB, which creates a lock file at `/pulsar/data/bookkeeper/ledgers/current/ledgers/LOCK` with the permission `0644` ignoring the umask. Here is the relevant error:

```
2022-05-14T03:45:06,903+0000  ERROR org.apache.bookkeeper.server.Main - Failed to build bookie server
java.io.IOException: Error open RocksDB database
    at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:199) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:88) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.lambda$static$0(KeyValueStorageRocksDB.java:62) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.storage.ldb.LedgerMetadataIndex.<init>(LedgerMetadataIndex.java:68) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.storage.ldb.SingleDirectoryDbLedgerStorage.<init>(SingleDirectoryDbLedgerStorage.java:169) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage.newSingleDirectoryDbLedgerStorage(DbLedgerStorage.java:150) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage.initialize(DbLedgerStorage.java:129) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.bookie.Bookie.<init>(Bookie.java:818) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.proto.BookieServer.newBookie(BookieServer.java:152) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.proto.BookieServer.<init>(BookieServer.java:120) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.server.service.BookieService.<init>(BookieService.java:52) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.server.Main.buildBookieServer(Main.java:304) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.server.Main.doMain(Main.java:226) [org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    at org.apache.bookkeeper.server.Main.main(Main.java:208) [org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
Caused by: org.rocksdb.RocksDBException: while open a file for lock: /pulsar/data/bookkeeper/ledgers/current/ledgers/LOCK: Permission denied
    at org.rocksdb.RocksDB.open(Native Method) ~[org.rocksdb-rocksdbjni-6.10.2.jar:?]
    at org.rocksdb.RocksDB.open(RocksDB.java:239) ~[org.rocksdb-rocksdbjni-6.10.2.jar:?]
    at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:196) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
    ... 13 more
```

As such, in order to support OpenShift, I exposed the `fsGroupChangePolicy`, which allows for OpenShift support, but not necessarily _seamless_ support.
2022-06-13 22:11:13 -05:00
Li Li
0429adb3d2
[Build] Publish charts to apache/pulsar-site branch asf-site-next (#264) 2022-05-12 11:09:14 +08:00
Frank Kelly
bfb6985de8
Add support for Horizontal Pod Autoscaling for Broker and Proxy. (#262)
* Add support for Horizontal Pod Autoscaling for Broker and Proxy.

* Add license
2022-05-06 08:04:13 -06:00
ran
cee3fcfe56
Bump version to 2.9.2 (#255)
* Bump version to `2.9.2`

* Because the latest Pulsar image is based on Java 11, some JVM param for printing GC information has been abandoned, change to use the new JVM param. refer to https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-BE93ABDC-999C-4CB5-A88B-1994AAAC74D5 and https://issues.redhat.com/browse/CLOUD-3040.

original param | new param
--|--
`-XX:+PrintGCDetails` | `-Xlog:gc*`
`-XX:+PrintGCApplicationStoppedTime` | `-Xlog:safepoint`
`-XX:+PrintHeapAtGC` | `-Xlog:gc+heap=trace`
`-XX:+PrintGCTimeStamps` | `-Xlog:gc::utctime`
* remove JVM param `-XX:G1LogLevel=finest`
2022-04-11 15:33:29 +08:00
Chirag Modi
192b3ca2ef
Remove completed init jobs using ttl (#235)
* feat: added ttlSecondsAfterFinished configuration to delete completed jobs

* added comments for clarification
2022-02-23 08:24:37 -08:00
Lari Hotari
3918ee36f0
[Build] Revert chart index publishing to new website (#234)
- publish to the old website location, apache/pulsar , branch asf-site
2022-02-17 12:56:34 -08:00
Lari Hotari
1c4f745941
Improve Zookeeper "ruok" probes: use TLS port when TLS is enabled, specify "-q 1" for nc (#223)
- NOTICE: we are no more using "bin/pulsar-zookeeper-ruok.sh" from the apachepulsar/pulsar docker image. The probe script is part of the chart.

* Pass "-q 1" to netcat (nc) to fix issue with Zookeeper ruok probe

- see https://github.com/apache/pulsar/pull/14088

* Send ruok to TLS port when TLS is enabled

* Bump chart version
2022-02-17 07:48:20 +02:00
Lari Hotari
5b90c5195c
[Build] Publish charts to apache/pulsar-site branch asf-site-next (#232)
- also use shallow cloning
2022-02-17 07:46:45 +02:00
Frank Kelly
9613ee0292
Make PodSecurityPolicy name unique in k8s cluster when rbac.limit_to_namespace is true (#224)
- allows having multiple Pulsar clusters in different K8S namespaces but having the same helm release name
  - PodSecurityPolicy is a cluster-level-resource and name would collide without this change
2022-02-04 10:41:10 +02:00
Lari Hotari
dd0e6d827d
Increase Zookeeper probe timeouts (#220)
- 5 seconds seems to be a too short probe timeout on a system with low resources such as in CI
2022-01-31 19:24:19 +02:00
Lari Hotari
dc97bd4ac6
[CI] Tolerate errors when collecting k8s logs in CI (#217)
- The log collection failed after a command failed.
- tolerate errors
2022-01-26 14:50:48 -06:00
Lari Hotari
d3e7a7e6c9
[CI] Fix issue with k8s log collection (#216)
- slash needs to be replaced with underscore
2022-01-26 20:49:06 +02:00
Lari Hotari
0093f91410
[CI] Collect and upload k8s logs on failure (#215) 2022-01-26 19:43:49 +02:00
MMeent
c0a8c1b97f
Use the 'pulsar.matchLabels' template for matching components of this chart. (#118)
This also limits the scope of the PodMonitors to the resources of only this install, instead of all installs that share `component:` label values.

Co-authored-by: Matthias van de Meent <matthias.vandemeent@cofano.nl>
2022-01-26 15:38:52 +02:00
Lari Hotari
41ff20ec5e
Don't enable pulsar manager by default (#213)
- because of security reasons
  - it increases the attack surface
- it's an unnecessary feature for most users
  - wasted resource consumption
2022-01-26 15:34:30 +02:00
Lari Hotari
fdf9dd7757
Add -XX:+ExitOnOutOfMemoryError to Zookeeper's PULSAR_GC parameters in default values.yaml (#211) 2022-01-26 15:34:07 +02:00
Lari Hotari
22f4b9b3bd
Wrap Zookeeper probe script with timeout command (#214)
so that the probe doesn't continue running indefinitely

- resolves the issue with Kubernetes <1.20
  "Before Kubernetes 1.20, the field timeoutSeconds was not respected for exec probes:
    probes continued running indefinitely, even past their configured deadline,
    until a result was returned."
    in https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes

- #179 already fixed the issue for Kubernetes 1.20+
2022-01-26 15:17:15 +02:00
Lari Hotari
475a4b0b39
Remove references to tag: 2.6.0 in examples (#210)
### Motivation

It's better to not maintain out-dated examples referencing the 2.6.0 tag version.

### Modifications

- remove out-dated examples
2022-01-25 23:30:46 -06:00
Lari Hotari
fa9c22d895
Upgrade default images for Grafana & Pulsar Manager (#206)
- Grafana Dashboard image from v0.0.10 to v0.0.16
  - changes:
    https://github.com/streamnative/apache-pulsar-grafana-dashboard/compare/d50e2758...v0.0.16

- Pulsar Manager from v0.1.0 to v0.2.0
  - changes:
    https://github.com/apache/pulsar-manager/compare/v0.1.0...v0.2.0
2022-01-25 10:11:33 +02:00
Shen Liu
1b3e875ba2
Fix ci error caused by wrong block of if clause. (#208)
Co-authored-by: druidliu <druidliu@tencent.com>
2022-01-25 07:44:08 +02:00
Lari Hotari
40a4d50923
Upgrade cert-manager to 1.5.4 (#204) 2022-01-23 09:24:44 +02:00
Shen Liu
91f8b6f6b1
Add multi volume support in bookkeeper. (#113)
* Add multi volume support in bookkeeper. (#112)

* Add multi volumes support in bookkeeper configmap.

Co-authored-by: druidliu <druidliu@tencent.com>

Fixes #112 

### Motivation

*Add option for user to choose whether using multi volume in bookeeper, especially while using `local-storage`.*

### Modifications

Add `useMultiVolumes` option under `.Values.bookkeeper.volumes.journal` and `.Values.bookkeeper.volumes.ledgers`.
User can choose how many volumes could be used for bookkeeper jounal or ledgers.

### Verifying this change

- [x] Make sure that the change passes the CI checks.
2022-01-22 23:08:07 -06:00
Lari Hotari
90933d508d
[CI] Show status and logs for metadata job in CI logs (#207) 2022-01-20 16:03:28 +02:00
Lari Hotari
63cbdfe687
Increase default initialDelaySeconds for Zookeeper probes to workaround ZOOKEEPER-3988 (#202)
- When TLS is enabled for Zookeeper, NettyServerCnxnFactory will be used.
  It contains the issue https://github.com/apache/pulsar/issues/11070 /
  https://issues.apache.org/jira/browse/ZOOKEEPER-3988
  - as a workaround, increase the initialDelaySeconds from 10 to 20 to
    reduce the likely hood of ZOOKEEPER-3988
2022-01-18 18:38:29 +02:00
Lari Hotari
a27ec0aebf
Change default podManagementPolicy to Parallel for Zookeeper (#203) 2022-01-18 18:38:22 +02:00
Hang Chen
aea6a4f367
useV2WireProtocol for bookkeeper autorecovery (#165) 2022-01-18 09:06:26 +02:00
cogito-kyle
adbc6b7fcf
Add custom labels to all k8s objects in chart (#201) 2022-01-18 08:47:49 +02:00
Lari Hotari
7219a37065
Fix chart releaser command which uses docker image (#199) 2022-01-12 12:45:58 +02:00
csthomas1
ccf78f1c9d
Added -Dlog4j2.formatMsgNoLookups=true to PULSAR_MANAGER_OPTS (#198)
* Added -Dlog4j2.formatMsgNoLookups=true to PULSAR_MANAGER_OPTS

* Bump the chart version to release changes

Co-authored-by: Lari Hotari <lhotari@apache.org>
2022-01-12 10:42:43 +02:00
Lari Hotari
46689ab30d
[CI] Upgrade k8s to 1.18 and also upgrade helm, kind & chart releaser versions (#192) 2022-01-10 22:57:58 +02:00
Aaron Johnson
cee3b5c5e6
added additionalCommand parameter (#150)
Co-authored-by: Aaron Johnson <aaron.johnson@crowdstrike.com>
2022-01-05 10:26:55 -06:00
Frank Kelly
a919f309c6
Add ability to run extra commands in the initialization jobs e.g. to quit istio sidecars (#181) 2022-01-05 16:24:19 +02:00
shaoyue
41dd2f5034
Fix #175 cluster initialize blocked when fail (#176) 2022-01-05 16:10:09 +02:00
Valeriano Manassero
25e997a425
Automate initialize (#138)
- no need to do "--set initialize=true" anymore
2022-01-05 16:08:11 +02:00
matejhasul
706c8c292b
Workaround kustomize bug in pulsar cluster init (#166)
Replace folding block with multiline string to workaround https://github.com/kubernetes-sigs/kustomize/issues/4201

There are also other places where this bug is hit, but extra generated newline is not significant.

Co-authored-by: Lari Hotari <lhotari@users.noreply.github.com>
2022-01-04 11:08:52 -06:00
Lari Hotari
d3589b1c82
[CI] Improve logging in CI scripts and add timeouts (#195)
- show events every 15 seconds
- dump logs every 5 minutes
- dump logs when timeouting
2022-01-04 17:24:28 +02:00
Lari Hotari
9b672379dd
[CI] Improve change detection by reusing solution from apache/pulsar (#194)
* [CI] Improve change detection by reusing solution from apache/pulsar

* Fix verify release
2022-01-04 11:40:40 +02:00
Shu.Wang
83bb8bd60f
Conditionally update ingress api version based on k8s version (#183)
* Update ingress api version, extension/v1beta1 will not be supported in new k8s version, this change keep backward compatibility for lower kubernetes version

* Update deprecated util Capabilities.KubeVersion.GitVersion to Capabilities.KubeVersion.Version
2022-01-04 00:53:21 -06:00
Shu.Wang
0a82ab0f9a
Fixes #177 Fix indentation of component, as it should be under the label tag (#182) 2022-01-03 21:57:45 +02:00
Lari Hotari
d74d08a89d
Use NIOServerCnxnFactory for Zookeeper to fix NPE issues with Pulsar 2.8.x+ (#180)
- follow recommendation in https://github.com/apache/pulsar/issues/11070#issuecomment-936539979
2022-01-03 11:59:58 +01:00
Lari Hotari
567bd7c5b3
[CI] Add job 45min timeout and cancel duplicate jobs (#193) 2022-01-03 10:17:21 +01:00
Jiwei Guo
0f6dea8022
Bump to Pulsar 2.7.4 (#189)
* Bump to Pulsar 2.7.4

* update

* update
2021-12-30 08:55:57 +02:00
Lari Hotari
b4b2fa7b80
[Security] Workaround for CVE-2021-44228 Log4J RCE when Log4J >= 2.10.0 (#186)
* [Security] Workaround for CVE-2021-44228 Log4J RCE when Log4J >= 2.10.0

- prevents the exploit by disabling message pattern lookups

* Bump the chart version
2021-12-10 18:30:01 +02:00
Lari Hotari
a16c6bbf19
Make k8s probe timeoutSeconds configurable and set default to 5s for k8s 1.20+ compatibility (#179)
- set to 5 seconds by default

- address compatibility with Kubernetes 1.20+. This impacts "bin/pulsar-zookeeper-ruok.sh" exec probe used in ZK.
  "Before Kubernetes 1.20, the field timeoutSeconds was not respected for exec probes: probes continued running indefinitely, even past their configured deadline, until a result was returned."
   https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
2021-11-25 08:46:42 +01:00
202 changed files with 10699 additions and 5175 deletions

View File

@ -31,16 +31,17 @@ github:
- helm
- helm-chart
features:
# Enable wiki for documentation
wiki: true
# Enable issues management
issues: true
# Enable projects for project management boards
projects: true
enabled_merge_buttons:
# enable squash button:
squash: true
# disable merge button:
merge: false
# disable rebase button:
rebase: false
notifications:
commits: commits@pulsar.apache.org
issues: commits@pulsar.apache.org
pullrequests: commits@pulsar.apache.org
discussions: dev@pulsar.apache.org
jira_options: link label

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,73 @@
{
"clientId": $ARGS.named.CLIENT_ID,
"enabled": true,
"clientAuthenticatorType": "client-secret",
"secret": $ARGS.named.CLIENT_SECRET,
"standardFlowEnabled" : false,
"implicitFlowEnabled" : false,
"serviceAccountsEnabled": true,
"protocol": "openid-connect",
"attributes": {
"realm_client": "false",
"oidc.ciba.grant.enabled": "false",
"client.secret.creation.time": "1735689600",
"backchannel.logout.session.required": "true",
"standard.token.exchange.enabled": "false",
"frontchannel.logout.session.required": "true",
"oauth2.device.authorization.grant.enabled": "false",
"display.on.consent.screen": "false",
"backchannel.logout.revoke.offline.tokens": "false"
},
"protocolMappers": [
{
"name": "sub",
"protocol": "openid-connect",
"protocolMapper": "oidc-hardcoded-claim-mapper",
"consentRequired": false,
"config": {
"introspection.token.claim": "true",
"claim.value": $ARGS.named.SUB_CLAIM_VALUE,
"userinfo.token.claim": "true",
"id.token.claim": "true",
"lightweight.claim": "false",
"access.token.claim": "true",
"claim.name": "sub",
"jsonType.label": "String",
"access.tokenResponse.claim": "false"
}
},
{
"name": "nbf",
"protocol": "openid-connect",
"protocolMapper": "oidc-hardcoded-claim-mapper",
"consentRequired": false,
"config": {
"introspection.token.claim": "true",
"claim.value": "1735689600",
"userinfo.token.claim": "true",
"id.token.claim": "true",
"lightweight.claim": "false",
"access.token.claim": "true",
"claim.name": "nbf",
"jsonType.label": "long",
"access.tokenResponse.claim": "false"
}
}
],
"defaultClientScopes": [
"web-origins",
"service_account",
"acr",
"profile",
"roles",
"basic",
"email"
],
"optionalClientScopes": [
"address",
"phone",
"organization",
"offline_access",
"microprofile-jwt"
]
}

View File

@ -0,0 +1,26 @@
# Keycloak
Keycloak is used to validate OIDC configuration.
To create the pulsar realm configuration, we use :
* `0-realm-pulsar-partial-export.json` : after creating pulsar realm in Keycloack UI, this file is the result of the partial export in Keycloak UI without options.
* `1-client-template.json` : this is the template to create pulsar clients.
To create the final `realm-pulsar.json`, merge files with `jq` command :
* create a client with `CLIENT_ID`, `CLIENT_SECRET` and `SUB_CLAIM_VALUE` :
```
CLIENT_ID=xx
CLIENT_SECRET=yy
SUB_CLAIM_VALUE=zz
jq -n --arg CLIENT_ID "$CLIENT_ID" --arg CLIENT_SECRET "$CLIENT_SECRET" --arg SUB_CLAIM_VALUE "$SUB_CLAIM_VALUE" 1-client-template.json > client.json
```
* then merge the realm and the client :
```
jq '.clients += [input]' 0-realm-pulsar-partial-export.json client.json > realm-pulsar.json
```

View File

@ -17,23 +17,18 @@
# under the License.
#
name: Precommit - Verify releasing Pulsar Helm Chart
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install chart
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PUBLISH_CHARTS: false
run: |
.ci/release.sh
tls:
enabled: false
# This block sets up an example Pulsar Realm
# https://www.keycloak.org/server/importExport#_importing_a_realm_from_a_directory
extraEnvVars:
- name: KEYCLOAK_EXTRA_ARGS
value: "--import-realm"
extraVolumes:
- name: realm-config
secret:
secretName: keycloak-ci-realm-config
extraVolumeMounts:
- name: realm-config
mountPath: "/opt/bitnami/keycloak/data/import"
readOnly: true

View File

@ -0,0 +1,5 @@
{
"type": "client_credentials",
"client_id": $ARGS.named.CLIENT_ID,
"client_secret": $ARGS.named.CLIENT_SECRET
}

View File

@ -1,3 +1,4 @@
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@ -20,36 +21,96 @@
set -e
BINDIR=`dirname "$0"`
PULSAR_HOME=`cd ${BINDIR}/..;pwd`
BINDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
PULSAR_HOME="$(cd "${BINDIR}/.." && pwd)"
VALUES_FILE=$1
TLS=${TLS:-"false"}
SYMMETRIC=${SYMMETRIC:-"false"}
FUNCTION=${FUNCTION:-"false"}
MANAGER=${MANAGER:-"false"}
ALLOW_LOADBALANCERS=${ALLOW_LOADBALANCERS:-"false"}
source ${PULSAR_HOME}/.ci/helm.sh
# create cluster
ci::create_cluster
# install storage provisioner
ci::install_storage_provisioner
ci::helm_repo_add
extra_opts=()
# Add any arguments after $1 to extra_opts
shift # Remove $1 from the argument list
while [[ $# -gt 0 ]]; do
extra_opts+=("$1")
shift
done
extra_opts=""
if [[ "x${SYMMETRIC}" == "xtrue" ]]; then
extra_opts="-s"
extra_opts+=("-s")
fi
# install pulsar chart
ci::install_pulsar_chart ${PULSAR_HOME}/${VALUES_FILE} ${extra_opts}
if [[ "x${EXTRA_SUPERUSERS}" != "x" ]]; then
extra_opts+=("--pulsar-superusers" "proxy-admin,broker-admin,admin,${EXTRA_SUPERUSERS}")
fi
# test producer
ci::test_pulsar_producer
install_type="install"
test_action="produce-consume"
if [[ "$UPGRADE_FROM_VERSION" != "" ]]; then
ALLOW_LOADBALANCERS="true"
# install older version of pulsar chart
PULSAR_CHART_VERSION="$UPGRADE_FROM_VERSION"
if [[ "x${FUNCTION}" == "xtrue" ]]; then
# install cert manager
# Install Prometheus Operator CRDs using the upgrade script since kube-prometheus-stack is now disabled before the upgrade
${PULSAR_HOME}/scripts/kube-prometheus-stack/upgrade_prometheus_operator_crds.sh
ci::install_pulsar_chart install ${PULSAR_HOME}/.ci/values-common.yaml ${PULSAR_HOME}/${VALUES_FILE} --set kube-prometheus-stack.enabled=false "${extra_opts[@]}"
install_type="upgrade"
echo "Wait 10 seconds"
sleep 10
# check pulsar environment
ci::check_pulsar_environment
# test that we can access the admin api
ci::test_pulsar_admin_api_access
# produce messages with old version of pulsar and consume with new version
ci::test_pulsar_producer_consumer "produce"
test_action="consume"
if [[ "$(ci::helm_values_for_deployment | yq .victoria-metrics-k8s-stack.enabled)" == "true" ]]; then
echo "Upgrade Victoria Metrics Operator CRDs before upgrading the deployment"
${PULSAR_HOME}/scripts/victoria-metrics-k8s-stack/upgrade_vm_operator_crds.sh
fi
fi
PULSAR_CHART_VERSION="local"
# install (or upgrade) pulsar chart
ci::install_pulsar_chart ${install_type} ${PULSAR_HOME}/.ci/values-common.yaml ${PULSAR_HOME}/${VALUES_FILE} "${extra_opts[@]}"
echo "Wait 10 seconds"
sleep 10
# check that there aren't any loadbalancers if ALLOW_LOADBALANCERS is false
if [[ "${ALLOW_LOADBALANCERS}" == "false" ]]; then
ci::check_loadbalancers
fi
# check pulsar environment
ci::check_pulsar_environment
# test that we can access the admin api
ci::test_pulsar_admin_api_access
# test producer/consumer
ci::test_pulsar_producer_consumer "${test_action}"
if [[ "$(ci::helm_values_for_deployment | yq .components.functions)" == "true" ]]; then
# test functions
ci::test_pulsar_function
fi
if [[ "$(ci::helm_values_for_deployment | yq .components.pulsar_manager)" == "true" ]]; then
# test manager
ci::test_pulsar_manager
fi
# delete the cluster
ci::delete_cluster

View File

@ -17,59 +17,14 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
# enable TLS
tls:
enabled: true
bookie:
enabled: true
# disable cert manager
# enable cert-manager
certs:
internal_issuer:
enabled: false
enabled: true
type: selfsigning

View File

@ -17,52 +17,6 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
# enable TLS
tls:
enabled: true
@ -71,7 +25,8 @@ tls:
broker:
enabled: true
# disable cert-manager
# enable cert-manager
certs:
internal_issuer:
enabled: false
enabled: true
type: selfsigning

View File

@ -0,0 +1,105 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# enable TLS with cacerts
tls:
enabled: true
proxy:
enabled: true
cacerts:
enabled: true
certs:
- name: common-cacert
existingSecret: "pulsar-ci-common-cacert"
secretKeys:
- ca.crt
broker:
enabled: true
cacerts:
enabled: true
certs:
- name: common-cacert
existingSecret: "pulsar-ci-common-cacert"
secretKeys:
- ca.crt
bookie:
enabled: true
cacerts:
enabled: true
certs:
- name: common-cacert
existingSecret: "pulsar-ci-common-cacert"
secretKeys:
- ca.crt
zookeeper:
enabled: true
cacerts:
enabled: true
certs:
- name: common-cacert
existingSecret: "pulsar-ci-common-cacert"
secretKeys:
- ca.crt
toolset:
cacerts:
enabled: true
certs:
- name: common-cacert
existingSecret: "pulsar-ci-common-cacert"
secretKeys:
- ca.crt
autorecovery:
cacerts:
enabled: true
certs:
- name: common-cacert
existingSecret: "pulsar-ci-common-cacert"
secretKeys:
- ca.crt
# enable cert-manager
certs:
internal_issuer:
enabled: true
type: selfsigning
# deploy cacerts
extraDeploy:
- |
apiVersion: "{{ .Values.certs.internal_issuer.apiVersion }}"
kind: Certificate
metadata:
name: "{{ template "pulsar.fullname" . }}-common-cacert"
namespace: {{ template "pulsar.namespace" . }}
labels:
{{- include "pulsar.standardLabels" . | nindent 4 }}
spec:
secretName: "{{ template "pulsar.fullname" . }}-common-cacert"
commonName: "common-cacert"
duration: "{{ .Values.certs.internal_issuer.duration }}"
renewBefore: "{{ .Values.certs.internal_issuer.renewBefore }}"
usages:
- server auth
- client auth
isCA: true
issuerRef:
name: "{{ template "pulsar.fullname" . }}-{{ .Values.certs.internal_issuer.component }}"
kind: Issuer
group: cert-manager.io

View File

@ -17,58 +17,13 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 2
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
auth:
authentication:
enabled: true
provider: "jwt"
jwt:
# Enable JWT authentication
enabled: true
# If the token is generated by a secret key, set the usingSecretKey as true.
# If the token is generated by a private key, set the usingSecretKey as false.
usingSecretKey: false
@ -81,3 +36,9 @@ auth:
proxy: "proxy-admin"
# pulsar-admin client to broker/proxy communication
client: "admin"
# pulsar-manager to broker communication
manager: "manager-admin"
components:
pulsar_manager: true

View File

@ -17,58 +17,13 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
auth:
authentication:
enabled: true
provider: "jwt"
jwt:
# Enable JWT authentication
enabled: true
# If the token is generated by a secret key, set the usingSecretKey as true.
# If the token is generated by a private key, set the usingSecretKey as false.
usingSecretKey: true
@ -81,3 +36,8 @@ auth:
proxy: "proxy-admin"
# pulsar-admin client to broker/proxy communication
client: "admin"
# pulsar manager to broker
manager: "manager-admin"
components:
pulsar_manager: true

View File

@ -1,64 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false

View File

@ -0,0 +1,94 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Mount crendentials to each component
proxy:
configData:
# Authentication settings of the broker itself. Used when the broker connects to other brokers, or when the proxy connects to brokers, either in same or other clusters
brokerClientAuthenticationPlugin: "org.apache.pulsar.client.impl.auth.oauth2.AuthenticationOAuth2"
brokerClientAuthenticationParameters: '{"privateKey":"file:///pulsar/auth/proxy/credentials_file.json","audience":"account","issuerUrl":"http://keycloak-ci-headless:8080/realms/pulsar"}'
extraVolumes:
- name: pulsar-proxy-credentials
secret:
secretName: pulsar-proxy-credentials
extraVolumeMounts:
- name: pulsar-proxy-credentials
mountPath: "/pulsar/auth/proxy"
readOnly: true
broker:
configData:
# Authentication settings of the broker itself. Used when the broker connects to other brokers, or when the proxy connects to brokers, either in same or other clusters
brokerClientAuthenticationPlugin: "org.apache.pulsar.client.impl.auth.oauth2.AuthenticationOAuth2"
brokerClientAuthenticationParameters: '{"privateKey":"file:///pulsar/auth/broker/credentials_file.json","audience":"account","issuerUrl":"http://keycloak-ci-headless:8080/realms/pulsar"}'
extraVolumes:
- name: pulsar-broker-credentials
secret:
secretName: pulsar-broker-credentials
extraVolumeMounts:
- name: pulsar-broker-credentials
mountPath: "/pulsar/auth/broker"
readOnly: true
toolset:
configData:
authPlugin: "org.apache.pulsar.client.impl.auth.oauth2.AuthenticationOAuth2"
authParams: '{"privateKey":"file:///pulsar/auth/admin/credentials_file.json","audience":"account","issuerUrl":"http://keycloak-ci-headless:8080/realms/pulsar"}'
extraVolumes:
- name: pulsar-admin-credentials
secret:
secretName: pulsar-admin-credentials
extraVolumeMounts:
- name: pulsar-admin-credentials
mountPath: "/pulsar/auth/admin"
readOnly: true
auth:
authentication:
enabled: true
openid:
# Enable openid authentication
enabled: true
# https://pulsar.apache.org/docs/next/security-openid-connect/#enable-openid-connect-authentication-in-the-broker-and-proxy
openIDAllowedTokenIssuers:
- http://keycloak-ci-headless:8080/realms/pulsar
openIDAllowedAudiences:
- account
#openIDTokenIssuerTrustCertsFilePath:
openIDRoleClaim: "sub"
openIDAcceptedTimeLeewaySeconds: "0"
openIDCacheSize: "5"
openIDCacheRefreshAfterWriteSeconds: "64800"
openIDCacheExpirationSeconds: "86400"
openIDHttpConnectionTimeoutMillis: "10000"
openIDHttpReadTimeoutMillis: "10000"
openIDKeyIdCacheMissRefreshSeconds: "300"
openIDRequireIssuersUseHttps: "false"
openIDFallbackDiscoveryMode: "DISABLED"
authorization:
enabled: true
superUsers:
# broker to broker communication
broker: "broker-admin"
# proxy to broker communication
proxy: "proxy-admin"
# pulsar-admin client to broker/proxy communication
client: "admin"
# pulsar manager to broker
manager: "manager-admin"

View File

@ -17,27 +17,19 @@
# under the License.
#
name: Precommit Style Check
on:
pull_request:
branches:
- '*'
jobs:
components:
zookeeper: false
oxia: true
# disable functions for oxia tests since there's no support for Oxia in
# BookKeeperPackagesStorage which requires Zookeeper
functions: false
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Set up Go 1.12
uses: actions/setup-go@v1
with:
go-version: 1.12
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Check license
run: |
go test license_test.go
oxia:
initialShardCount: 3
replicationFactor: 3
server:
replicas: 3
cpuLimit: 333m
memoryLimit: 200Mi
dbCacheSizeMb: 100
storageSize: 1Gi

View File

@ -1,95 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
persistence: false
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
metadata:
image:
repository: apachepulsar/pulsar-all
tag: 2.6.0
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
# use pulsar image
images:
zookeeper:
repository: apachepulsar/pulsar-all
tag: 2.6.0
bookie:
repository: apachepulsar/pulsar-all
tag: 2.6.0
autorecovery:
repository: apachepulsar/pulsar-all
tag: 2.6.0
broker:
repository: apachepulsar/pulsar-all
tag: 2.6.0
functions:
repository: apachepulsar/pulsar-all
tag: 2.6.0
proxy:
repository: apachepulsar/pulsar-all
tag: 2.6.0
pulsar_metadata:
image:
repository: apachepulsar/pulsar-all
tag: 2.6.0

View File

@ -17,9 +17,5 @@
# under the License.
#
set -e
BINDIR=`dirname "$0"`
CI_HOME=`cd ${BINDIR};pwd`
${CI_HOME}/ct.sh -c lint
components:
pulsar_manager: true

View File

@ -0,0 +1,20 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
defaultPulsarImageTag: 3.0.12

View File

@ -17,51 +17,6 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
# enable TLS
tls:
@ -75,7 +30,8 @@ tls:
zookeeper:
enabled: true
# disable cert-manager
# enable cert-manager
certs:
internal_issuer:
enabled: false
enabled: true
type: selfsigning

View File

@ -0,0 +1,19 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

View File

@ -0,0 +1,60 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
victoria-metrics-k8s-stack:
enabled: true
victoria-metrics-operator:
enabled: true
vmsingle:
enabled: true
vmagent:
enabled: true
grafana:
enabled: true
adminPassword: pulsar-ci-admin
prometheus-node-exporter:
enabled: true
zookeeper:
podMonitor:
enabled: true
bookkeeper:
podMonitor:
enabled: true
broker:
podMonitor:
enabled: true
autorecovery:
podMonitor:
enabled: true
proxy:
podMonitor:
enabled: true
oxia:
coordinator:
podMonitor:
enabled: true
server:
podMonitor:
enabled: true

View File

@ -17,59 +17,14 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
# enable TLS
tls:
enabled: true
zookeeper:
enabled: true
# disable cert manager
# enable cert-manager
certs:
internal_issuer:
enabled: false
enabled: true
type: selfsigning

View File

@ -17,52 +17,6 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
# disabled AntiAffinity
affinity:
anti_affinity: false
# disable auto recovery and pulsar manager
components:
autorecovery: false
pulsar_manager: false
zookeeper:
replicaCount: 1
bookkeeper:
replicaCount: 3
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
broker:
replicaCount: 1
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
autoSkipNonRecoverableData: "true"
# storage settings
managedLedgerDefaultEnsembleSize: "1"
managedLedgerDefaultWriteQuorum: "1"
managedLedgerDefaultAckQuorum: "1"
proxy:
replicaCount: 1
toolset:
useProxy: false
# enable TLS
tls:
enabled: true
@ -71,7 +25,8 @@ tls:
bookie:
enabled: true
# disable cert manager
# enable cert-manager
certs:
internal_issuer:
enabled: false
enabled: true
type: selfsigning

View File

@ -0,0 +1,41 @@
#!/bin/bash
# this script is used to install tools for the GitHub Actions CI runner while debugging with ssh
if [[ -z "${GITHUB_ACTIONS}" ]]; then
echo "Error: This script is intended to run only in GitHub Actions environment"
exit 1
fi
cat >> $HOME/.bashrc <<'EOF'
function use_kind_kubeconfig() {
export KUBECONFIG=$(ls $HOME/kind/pulsar-ci-*/kubeconfig.yaml)
}
function kubectl() {
# use kind environment's kubeconfig
if [ -z "$KUBECONFIG" ]; then
use_kind_kubeconfig
fi
command kubectl "$@"
}
function k9s() {
# use kind environment's kubeconfig
if [ -z "$KUBECONFIG" ]; then
use_kind_kubeconfig
fi
# install k9s on the fly
if [ ! -x /usr/local/bin/k9s ]; then
echo "Installing k9s..."
curl -L -s https://github.com/derailed/k9s/releases/download/v0.40.5/k9s_Linux_amd64.tar.gz | sudo tar xz -C /usr/local/bin k9s
fi
command k9s "$@"
}
alias k=kubectl
EOF
cat >> $HOME/.bash_profile <<'EOF'
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
EOF

167
.ci/ct.sh
View File

@ -1,167 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
DEFAULT_IMAGE=quay.io/helmpack/chart-testing:v3.0.0
show_help() {
cat << EOF
Usage: $(basename "$0") <options>
-h, --help Display help
-i, --image The chart-testing Docker image to use (default: quay.io/helmpack/chart-testing:v2.4.0)
-c, --command The chart-testing command to run
--config The path to the chart-testing config file
--kubeconfig The path to the kube config file
EOF
}
main() {
local image="$DEFAULT_IMAGE"
local config=
local command=
local kubeconfig="$HOME/.kube/config"
parse_command_line "$@"
if [[ -z "$command" ]]; then
echo "ERROR: '-c|--command' is required." >&2
show_help
exit 1
fi
run_ct_container
trap cleanup EXIT
local changed
changed=$(docker_exec ct list-changed)
if [[ -z "$changed" ]]; then
echo 'No chart changes detected.'
echo "::set-output name=changed::false"
return
fi
# Convenience output for other actions to make use of ct config to check if
# charts changed.
echo "::set-output name=changed::true"
# All other ct commands require a cluster to be created in a previous step.
if [[ "$command" != "lint" ]] && [[ "$command" != "list-changed" ]]; then
configure_kube
fi
run_ct
}
parse_command_line() {
while :; do
case "${1:-}" in
-h|--help)
show_help
exit
;;
-i|--image)
if [[ -n "${2:-}" ]]; then
image="$2"
shift
else
echo "ERROR: '-i|--image' cannot be empty." >&2
show_help
exit 1
fi
;;
-c|--command)
if [[ -n "${2:-}" ]]; then
command="$2"
shift
else
echo "ERROR: '-c|--command' cannot be empty." >&2
show_help
exit 1
fi
;;
--config)
if [[ -n "${2:-}" ]]; then
config="$2"
shift
else
echo "ERROR: '--config' cannot be empty." >&2
show_help
exit 1
fi
;;
--kubeconfig)
if [[ -n "${2:-}" ]]; then
kubeconfig="$2"
shift
else
echo "ERROR: '--kubeconfig' cannot be empty." >&2
show_help
exit 1
fi
;;
*)
break
;;
esac
shift
done
}
run_ct_container() {
echo 'Running ct container...'
local args=(run --rm --interactive --detach --network host --name ct "--volume=$(pwd):/workdir" "--workdir=/workdir")
if [[ -n "$config" ]]; then
args+=("--volume=$(pwd)/$config:/etc/ct/ct.yaml" )
fi
args+=("$image" cat)
docker "${args[@]}"
echo
}
configure_kube() {
docker_exec sh -c 'mkdir -p /root/.kube'
docker cp "$kubeconfig" ct:/root/.kube/config
}
run_ct() {
echo "Running 'ct $command'..."
docker_exec ct "$command"
echo
}
cleanup() {
echo 'Removing ct container...'
docker kill ct > /dev/null 2>&1
echo 'Done!'
}
docker_exec() {
docker exec --interactive ct "$@"
}
main "$@"

591
.ci/helm.sh Normal file → Executable file
View File

@ -17,17 +17,42 @@
# specific language governing permissions and limitations
# under the License.
#
BINDIR=`dirname "$0"`
PULSAR_HOME=`cd ${BINDIR}/..;pwd`
BINDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
PULSAR_HOME="$(cd "${BINDIR}/.." && pwd)"
CHARTS_HOME=${PULSAR_HOME}
PULSAR_CHART_LOCAL=${CHARTS_HOME}/charts/pulsar
PULSAR_CHART_VERSION=${PULSAR_CHART_VERSION:-"local"}
OUTPUT_BIN=${CHARTS_HOME}/output/bin
KIND_BIN=$OUTPUT_BIN/kind
HELM=${OUTPUT_BIN}/helm
KUBECTL=${OUTPUT_BIN}/kubectl
NAMESPACE=pulsar
CLUSTER=pulsar-ci
CLUSTER_ID=$(uuidgen)
: ${CLUSTER_ID:=$(uuidgen)}
K8S_LOGS_DIR="${K8S_LOGS_DIR:-/tmp/k8s-logs}"
export PATH="$OUTPUT_BIN:$PATH"
# brew package 'coreutils' is required on MacOSX
# coreutils includes the 'timeout' command
if [[ "$OSTYPE" == "darwin"* ]]; then
brew_gnubin_packages=(coreutils)
if ! type -P brew &>/dev/null; then
echo "On MacOSX, you must install required binaries with the following command:"
echo "brew install" "${brew_gnubin_packages[@]}"
exit 1
fi
for dep in "${brew_gnubin_packages[@]}"; do
path_element="$(brew --prefix)/opt/${dep}/libexec/gnubin"
if [ ! -d "${path_element}" ]; then
echo "'${path_element}' is missing. Quick fix: 'brew install ${dep}'."
echo "On MacOSX, you must install required binaries with the following command:"
echo "brew install" "${brew_gnubin_packages[@]}"
exit 1
fi
PATH="${path_element}:$PATH"
done
export PATH
fi
function ci::create_cluster() {
echo "Creating a kind cluster ..."
@ -41,21 +66,6 @@ function ci::delete_cluster() {
echo "Successfully delete a kind cluster."
}
function ci::install_storage_provisioner() {
echo "Installing the local storage provisioner ..."
${HELM} repo add streamnative https://charts.streamnative.io
${HELM} repo update
${HELM} install local-storage-provisioner streamnative/local-storage-provisioner
WC=$(${KUBECTL} get pods --field-selector=status.phase=Running | grep local-storage-provisioner | wc -l)
while [[ ${WC} -lt 1 ]]; do
echo ${WC};
sleep 15
${KUBECTL} get pods --field-selector=status.phase=Running
WC=$(${KUBECTL} get pods --field-selector=status.phase=Running | grep local-storage-provisioner | wc -l)
done
echo "Successfully installed the local storage provisioner."
}
function ci::install_cert_manager() {
echo "Installing the cert-manager ..."
${KUBECTL} create namespace cert-manager
@ -65,100 +75,513 @@ function ci::install_cert_manager() {
echo ${WC};
sleep 15
${KUBECTL} get pods -n cert-manager
${KUBECTL} get events --sort-by=.lastTimestamp -A | tail -n 30 || true
WC=$(${KUBECTL} get pods -n cert-manager --field-selector=status.phase=Running | wc -l)
done
echo "Successfully installed the cert manager."
}
function ci::install_pulsar_chart() {
local value_file=$1
local extra_opts=$2
echo "Installing the pulsar chart"
${KUBECTL} create namespace ${NAMESPACE}
echo ${CHARTS_HOME}/scripts/pulsar/prepare_helm_release.sh -k ${CLUSTER} -n ${NAMESPACE} ${extra_opts}
${CHARTS_HOME}/scripts/pulsar/prepare_helm_release.sh -k ${CLUSTER} -n ${NAMESPACE} ${extra_opts}
${CHARTS_HOME}/scripts/pulsar/upload_tls.sh -k ${CLUSTER} -n ${NAMESPACE} -d ${PULSAR_HOME}/.ci/tls
sleep 10
echo ${HELM} install --set initialize=true --values ${value_file} ${CLUSTER} ${CHARTS_HOME}/charts/pulsar
${HELM} template --values ${value_file} ${CLUSTER} ${CHARTS_HOME}/charts/pulsar
${HELM} install --set initialize=true --values ${value_file} --namespace=${NAMESPACE} ${CLUSTER} ${CHARTS_HOME}/charts/pulsar
echo "wait until broker is alive"
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-broker | wc -l)
while [[ ${WC} -lt 1 ]]; do
echo ${WC};
sleep 15
${KUBECTL} get pods -n ${NAMESPACE}
WC=$(${KUBECTL} get pods -n ${NAMESPACE} | grep ${CLUSTER}-broker | wc -l)
if [[ ${WC} -gt 1 ]]; then
${KUBECTL} describe pod -n ${NAMESPACE} pulsar-ci-broker-0
${KUBECTL} logs -n ${NAMESPACE} pulsar-ci-broker-0
fi
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-broker | wc -l)
done
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-broker; do sleep 3; done'
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until [ "$(curl -L http://pulsar-ci-broker:8080/status.html)" == "OK" ]; do sleep 3; done'
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-proxy | wc -l)
while [[ ${WC} -lt 1 ]]; do
echo ${WC};
sleep 15
${KUBECTL} get pods -n ${NAMESPACE}
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-proxy | wc -l)
done
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-proxy; do sleep 3; done'
# ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until [ "$(curl -L http://pulsar-ci-proxy:8080/status.html)" == "OK" ]; do sleep 3; done'
function ci::helm_repo_add() {
echo "Adding the helm repo ..."
${HELM} repo add prometheus-community https://prometheus-community.github.io/helm-charts
${HELM} repo add vm https://victoriametrics.github.io/helm-charts/
${HELM} repo update
echo "Successfully added the helm repo."
}
function ci::test_pulsar_producer() {
sleep 120
function ci::print_pod_logs() {
echo "Logs for all containers:"
for k8sobject in $(${KUBECTL} get pods,jobs -n ${NAMESPACE} -o=name); do
${KUBECTL} logs -n ${NAMESPACE} "$k8sobject" --all-containers=true --ignore-errors=true --prefix=true --tail=100 || true
done;
}
function ci::collect_k8s_logs() {
mkdir -p "${K8S_LOGS_DIR}" && cd "${K8S_LOGS_DIR}"
echo "Collecting k8s logs to ${K8S_LOGS_DIR}"
for k8sobject in $(${KUBECTL} get pods,jobs -n ${NAMESPACE} -o=name); do
filebase="${k8sobject//\//_}"
${KUBECTL} logs -n ${NAMESPACE} "$k8sobject" --all-containers=true --ignore-errors=true --prefix=true > "${filebase}.$$.log.txt" || true
${KUBECTL} logs -n ${NAMESPACE} "$k8sobject" --all-containers=true --ignore-errors=true --prefix=true --previous=true > "${filebase}.previous.$$.log.txt" || true
done;
${KUBECTL} get events --sort-by=.lastTimestamp -A > events.$$.log.txt || true
${KUBECTL} get events --sort-by=.lastTimestamp -A -o yaml > events.$$.log.yaml || true
${KUBECTL} get -n ${NAMESPACE} all -o yaml > k8s_resources.$$.yaml || true
}
function ci::install_pulsar_chart() {
local install_type=$1
local common_value_file=$2
local value_file=$3
shift 3
local extra_values=()
local extra_opts=()
local values_next=false
for arg in "$@"; do
if [[ "$arg" == "--values" || "$arg" == "--set" ]]; then
extra_values+=("$arg")
values_next=true
elif [[ "$values_next" == true ]]; then
extra_values+=("$arg")
values_next=false
else
extra_opts+=("$arg")
fi
done
local install_args
if [[ "${install_type}" == "install" ]]; then
echo "Installing the pulsar chart"
${KUBECTL} create namespace ${NAMESPACE}
ci::install_cert_manager
echo ${CHARTS_HOME}/scripts/pulsar/prepare_helm_release.sh -k ${CLUSTER} -n ${NAMESPACE} "${extra_opts[@]}"
${CHARTS_HOME}/scripts/pulsar/prepare_helm_release.sh -k ${CLUSTER} -n ${NAMESPACE} "${extra_opts[@]}"
sleep 10
# install metallb for loadbalancer support
# following instructions from https://kind.sigs.k8s.io/docs/user/loadbalancer/
${KUBECTL} apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml
# wait until metallb is ready
${KUBECTL} wait --namespace metallb-system \
--for=condition=ready pod \
--selector=app=metallb \
--timeout=120s
# configure metallb
${KUBECTL} apply -f ${BINDIR}/metallb/metallb-config.yaml
install_args=""
# create auth resources
if [[ "x${AUTHENTICATION_PROVIDER}" == "xopenid" ]]; then
ci::create_openid_resources
fi
else
install_args="--wait --wait-for-jobs --timeout 360s --debug"
fi
CHART_ARGS=""
if [[ "${PULSAR_CHART_VERSION}" == "local" ]]; then
set -x
${HELM} dependency update ${PULSAR_CHART_LOCAL}
set +x
CHART_ARGS="${PULSAR_CHART_LOCAL}"
else
set -x
${HELM} repo add apache https://pulsar.apache.org/charts
set +x
CHART_ARGS="apache/pulsar --dependency-update"
if [[ "${PULSAR_CHART_VERSION}" != "latest" ]]; then
CHART_ARGS="${CHART_ARGS} --version ${PULSAR_CHART_VERSION}"
fi
fi
set -x
${HELM} template --values ${common_value_file} --values ${value_file} "${extra_values[@]}" ${CLUSTER} ${CHART_ARGS}
${HELM} ${install_type} --values ${common_value_file} --values ${value_file} "${extra_values[@]}" --namespace=${NAMESPACE} ${CLUSTER} ${CHART_ARGS} ${install_args}
set +x
if [[ "${install_type}" == "install" ]]; then
echo "wait until broker is alive"
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-broker | wc -l)
counter=1
while [[ ${WC} -lt 1 ]]; do
((counter++))
echo ${WC};
sleep 15
${KUBECTL} get pods,jobs -n ${NAMESPACE}
${KUBECTL} get events --sort-by=.lastTimestamp -A | tail -n 30 || true
if [[ $((counter % 20)) -eq 0 ]]; then
ci::print_pod_logs
if [[ $counter -gt 100 ]]; then
echo >&2 "Timeout waiting..."
exit 1
fi
fi
WC=$(${KUBECTL} get pods -n ${NAMESPACE} | grep ${CLUSTER}-broker | wc -l)
if [[ ${WC} -gt 1 ]]; then
${KUBECTL} describe pod -n ${NAMESPACE} pulsar-ci-broker-0
${KUBECTL} logs -n ${NAMESPACE} pulsar-ci-broker-0
fi
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-broker | wc -l)
done
timeout 300s ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-broker; do sleep 3; done' || { echo >&2 "Timeout waiting..."; ci::print_pod_logs; exit 1; }
timeout 120s ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until [ "$(curl -s -L http://pulsar-ci-broker:8080/status.html)" == "OK" ]; do sleep 3; done' || { echo >&2 "Timeout waiting..."; ci::print_pod_logs; exit 1; }
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-proxy | wc -l)
counter=1
while [[ ${WC} -lt 1 ]]; do
((counter++))
echo ${WC};
sleep 15
${KUBECTL} get pods,jobs -n ${NAMESPACE}
${KUBECTL} get events --sort-by=.lastTimestamp -A | tail -n 30 || true
if [[ $((counter % 8)) -eq 0 ]]; then
ci::print_pod_logs
if [[ $counter -gt 16 ]]; then
echo >&2 "Timeout waiting..."
exit 1
fi
fi
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep ${CLUSTER}-proxy | wc -l)
done
timeout 300s ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-proxy; do sleep 3; done' || { echo >&2 "Timeout waiting..."; ci::print_pod_logs; exit 1; }
echo "Install complete"
else
echo "wait until broker is alive"
timeout 300s ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-broker; do sleep 3; done' || { echo >&2 "Timeout waiting..."; ci::print_pod_logs; exit 1; }
timeout 120s ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until [ "$(curl -s -L http://pulsar-ci-broker:8080/status.html)" == "OK" ]; do sleep 3; done' || { echo >&2 "Timeout waiting..."; ci::print_pod_logs; exit 1; }
echo "wait until proxy is alive"
timeout 300s ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-proxy; do sleep 3; done' || { echo >&2 "Timeout waiting..."; ci::print_pod_logs; exit 1; }
echo "Upgrade complete"
fi
}
helm_values_cached=""
function ci::helm_values_for_deployment() {
if [[ -z "${helm_values_cached}" ]]; then
helm_values_cached=$(helm get values -n ${NAMESPACE} ${CLUSTER} -a -o yaml)
fi
printf "%s" "${helm_values_cached}"
}
function ci::check_pulsar_environment() {
echo "Wait until pulsar-ci-broker is ready"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-broker; do sleep 3; done'
echo "Wait until pulsar-ci-proxy is ready"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-proxy; do sleep 3; done'
echo "bookie-0 disk usage"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-bookie-0 -- df -h
echo "bookie-0 bookkeeper.conf"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-bookie-0 -- cat conf/bookkeeper.conf
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/bookkeeper shell listbookies -rw
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/bookkeeper shell listbookies -ro
echo "bookie-0 bookies list (rw)"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/bookkeeper shell listbookies -rw | grep ListBookiesCommand
echo "bookie-0 bookies list (ro)"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/bookkeeper shell listbookies -ro | grep ListBookiesCommand
}
# function to retry a given commend 3 times with a backoff of 10 seconds in between
function ci::retry() {
local n=1
local max=3
local delay=10
while true; do
"$@" && break || {
if [[ $n -lt $max ]]; then
((n++))
echo "::warning::Command failed. Attempt $n/$max:"
sleep $delay
else
fail "::error::The command has failed after $n attempts."
fi
}
done
}
function ci::test_pulsar_admin_api_access() {
echo "Test pulsar admin api access"
ci::retry ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin tenants list
}
function ci::test_create_test_namespace() {
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin tenants create pulsar-ci
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin namespaces create pulsar-ci/test
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client produce -m "test-message" pulsar-ci/test/test-topic
}
function ci::test_pulsar_producer_consumer() {
action="${1:-"produce-consume"}"
echo "Testing with ${action}"
if [[ "$(ci::helm_values_for_deployment | yq .tls.proxy.enabled)" == "true" ]]; then
PROXY_URL="pulsar+ssl://pulsar-ci-proxy:6651"
else
PROXY_URL="pulsar://pulsar-ci-proxy:6650"
fi
set -x
if [[ "${action}" == "produce" || "${action}" == "produce-consume" ]]; then
ci::test_create_test_namespace
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin topics create pulsar-ci/test/test-topic
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin topics create-subscription -s test pulsar-ci/test/test-topic
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client produce -m "test-message" pulsar-ci/test/test-topic
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin topics create-subscription -s test2 pulsar-ci/test/test-topic
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client --url "${PROXY_URL}" produce -m "test-message2" pulsar-ci/test/test-topic
fi
if [[ "${action}" == "consume" || "${action}" == "produce-consume" ]]; then
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client consume -s test pulsar-ci/test/test-topic
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client --url "${PROXY_URL}" consume -s test2 pulsar-ci/test/test-topic
fi
set +x
}
function ci::wait_function_running() {
num_running=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions status --tenant pulsar-ci --namespace test --name test-function | bin/jq .numRunning')
num_running=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions status --tenant pulsar-ci --namespace test --name test-function' | jq .numRunning)
counter=1
while [[ ${num_running} -lt 1 ]]; do
echo ${num_running}
((counter++))
if [[ $counter -gt 6 ]]; then
echo >&2 "Timeout waiting..."
return 1
fi
echo "Waiting 15 seconds for function to be running"
sleep 15
${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running
num_running=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions status --tenant pulsar-ci --namespace test --name test-function | bin/jq .numRunning')
${KUBECTL} get pods -n ${NAMESPACE} -l component=function || true
${KUBECTL} get events --sort-by=.lastTimestamp -A | tail -n 30 || true
podname=$(${KUBECTL} get pods -l component=function -n ${NAMESPACE} --no-headers -o custom-columns=":metadata.name") || true
if [[ -n "$podname" ]]; then
echo "Function pod is $podname"
${KUBECTL} describe pod -n ${NAMESPACE} $podname
echo "Function pod logs"
${KUBECTL} logs -n ${NAMESPACE} $podname
fi
num_running=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions status --tenant pulsar-ci --namespace test --name test-function' | jq .numRunning)
done
}
function ci::wait_message_processed() {
num_processed=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions stats --tenant pulsar-ci --namespace test --name test-function | bin/jq .processedSuccessfullyTotal')
num_processed=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions stats --tenant pulsar-ci --namespace test --name test-function' | jq .processedSuccessfullyTotal)
podname=$(${KUBECTL} get pods -l component=function -n ${NAMESPACE} --no-headers -o custom-columns=":metadata.name")
counter=1
while [[ ${num_processed} -lt 1 ]]; do
echo ${num_processed}
((counter++))
if [[ $counter -gt 6 ]]; then
echo >&2 "Timeout waiting..."
return 1
fi
echo "Waiting 15 seconds for message to be processed"
sleep 15
echo "Function pod is $podname"
${KUBECTL} describe pod -n ${NAMESPACE} $podname
echo "Function pod logs"
${KUBECTL} logs -n ${NAMESPACE} $podname
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin functions stats --tenant pulsar-ci --namespace test --name test-function
num_processed=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions stats --tenant pulsar-ci --namespace test --name test-function | bin/jq .processedSuccessfullyTotal')
num_processed=$(${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'bin/pulsar-admin functions stats --tenant pulsar-ci --namespace test --name test-function' | jq .processedSuccessfullyTotal)
done
}
function ci::test_pulsar_function() {
sleep 120
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-broker; do sleep 3; done'
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bash -c 'until nslookup pulsar-ci-proxy; do sleep 3; done'
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-bookie-0 -- df -h
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/bookkeeper shell listbookies -rw
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/bookkeeper shell listbookies -ro
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- curl --retry 10 -L -o bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- chmod +x bin/jq
echo "Testing functions"
echo "Creating function"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin functions create --tenant pulsar-ci --namespace test --name test-function --inputs "pulsar-ci/test/test_input" --output "pulsar-ci/test/test_output" --parallelism 1 --classname org.apache.pulsar.functions.api.examples.ExclamationFunction --jar /pulsar/examples/api-examples.jar
echo "Creating subscription for output topic"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-admin topics create-subscription -s test pulsar-ci/test/test_output
echo "Waiting for function to be ready"
# wait until the function is running
# TODO: re-enable function test
# ci::wait_function_running
# ${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client produce -m "hello pulsar function!" pulsar-ci/test/test_input
# ci::wait_message_processed
ci::wait_function_running
echo "Sending input message"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client produce -m 'hello pulsar function!' pulsar-ci/test/test_input
echo "Waiting for message to be processed"
ci::wait_message_processed
echo "Consuming output message"
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-toolset-0 -- bin/pulsar-client consume -s test pulsar-ci/test/test_output
}
function ci::test_pulsar_manager() {
echo "Testing pulsar manager"
until ${KUBECTL} get jobs -n ${NAMESPACE} ${CLUSTER}-pulsar-manager-init -o json | jq -r '.status.conditions[] | select (.type | test("Complete")).status' | grep True; do sleep 3; done
${KUBECTL} describe job -n ${NAMESPACE} ${CLUSTER}-pulsar-manager-init
${KUBECTL} logs -n ${NAMESPACE} job.batch/${CLUSTER}-pulsar-manager-init
${KUBECTL} exec -n ${NAMESPACE} ${CLUSTER}-pulsar-manager-0 -- cat /pulsar-manager/pulsar-manager.log
echo "Checking Podname"
podname=$(${KUBECTL} get pods -n ${NAMESPACE} -l component=pulsar-manager --no-headers -o custom-columns=":metadata.name")
echo "Getting pulsar manager UI password"
PASSWORD=$(${KUBECTL} get secret -n ${NAMESPACE} -l component=pulsar-manager -o=jsonpath="{.items[0].data.UI_PASSWORD}" | base64 --decode)
echo "Getting CSRF_TOKEN"
CSRF_TOKEN=$(${KUBECTL} exec -n ${NAMESPACE} ${podname} -- curl http://127.0.0.1:7750/pulsar-manager/csrf-token)
echo "Performing login"
${KUBECTL} exec -n ${NAMESPACE} ${podname} -- curl -X POST http://127.0.0.1:9527/pulsar-manager/login \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json' \
-H "X-XSRF-TOKEN: $CSRF_TOKEN" \
-H "Cookie: XSRF-TOKEN=$CSRF_TOKEN" \
-sS -D headers.txt \
-d '{"username": "pulsar", "password": "'${PASSWORD}'"}'
LOGIN_TOKEN=$(${KUBECTL} exec -n ${NAMESPACE} ${podname} -- grep "token:" headers.txt | sed 's/^.*: //')
LOGIN_JSESSIONID=$(${KUBECTL} exec -n ${NAMESPACE} ${podname} -- grep -o "JSESSIONID=[a-zA-Z0-9_]*" headers.txt | sed 's/^.*=//')
echo "Checking environment"
envs=$(${KUBECTL} exec -n ${NAMESPACE} ${podname} -- curl -X GET http://127.0.0.1:9527/pulsar-manager/environments \
-H 'Content-Type: application/json' \
-H "token: $LOGIN_TOKEN" \
-H "X-XSRF-TOKEN: $CSRF_TOKEN" \
-H "username: pulsar" \
-H "Cookie: XSRF-TOKEN=$CSRF_TOKEN; JSESSIONID=$LOGIN_JSESSIONID;")
echo "$envs"
number_of_envs=$(echo $envs | jq '.total')
if [ "$number_of_envs" -ne 1 ]; then
echo "Error: Did not find expected environment"
exit 1
fi
# Force manager to query broker for tenant info. This will require use of the manager's JWT, if JWT authentication is enabled.
echo "Checking tenants"
pulsar_env=$(echo $envs | jq -r '.data[0].name')
tenants=$(${KUBECTL} exec -n ${NAMESPACE} ${podname} -- curl -X GET http://127.0.0.1:9527/pulsar-manager/admin/v2/tenants \
-H 'Content-Type: application/json' \
-H "token: $LOGIN_TOKEN" \
-H "X-XSRF-TOKEN: $CSRF_TOKEN" \
-H "username: pulsar" \
-H "tenant: pulsar" \
-H "environment: ${pulsar_env}" \
-H "Cookie: XSRF-TOKEN=$CSRF_TOKEN; JSESSIONID=$LOGIN_JSESSIONID;")
echo "$tenants"
number_of_tenants=$(echo $tenants | jq '.total')
if [ "$number_of_tenants" -lt 1 ]; then
echo "Error: Found no tenants!"
exit 1
fi
}
function ci::check_loadbalancers() {
(
set +e
${KUBECTL} get services -n ${NAMESPACE} | grep LoadBalancer
if [ $? -eq 0 ]; then
echo "Error: Found service with type LoadBalancer. This is not allowed because of security reasons."
exit 1
fi
exit 0
)
}
function ci::validate_kustomize_yaml() {
# if kustomize is not installed, install kustomize to a temp directory
if ! command -v kustomize &> /dev/null; then
KUSTOMIZE_VERSION=5.6.0
KUSTOMIZE_DIR=$(mktemp -d)
echo "Installing kustomize ${KUSTOMIZE_VERSION} to ${KUSTOMIZE_DIR}"
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash -s ${KUSTOMIZE_VERSION} ${KUSTOMIZE_DIR}
export PATH=${KUSTOMIZE_DIR}:$PATH
fi
# prevent regression of https://github.com/apache/pulsar-helm-chart/issues/569
local kustomize_yaml_dir=$(mktemp -d)
cp ${PULSAR_HOME}/.ci/kustomization.yaml ${kustomize_yaml_dir}
PULSAR_HOME=${PULSAR_HOME} yq -i '.helmGlobals.chartHome = env(PULSAR_HOME) + "/charts"' ${kustomize_yaml_dir}/kustomization.yaml
failures=0
# validate zookeeper init
echo "Validating kustomize yaml output with zookeeper init"
_ci::validate_kustomize_yaml ${kustomize_yaml_dir} || ((failures++))
# validate oxia init
yq -i '.helmCharts[0].valuesInline.components += {"zookeeper": false, "oxia": true}' ${kustomize_yaml_dir}/kustomization.yaml
echo "Validating kustomize yaml output with oxia init"
_ci::validate_kustomize_yaml ${kustomize_yaml_dir} || ((failures++))
if [ $failures -gt 0 ]; then
exit 1
fi
}
function _ci::validate_kustomize_yaml() {
local kustomize_yaml_dir=$1
kustomize build --enable-helm --helm-kube-version 1.23.0 --load-restrictor=LoadRestrictionsNone ${kustomize_yaml_dir} | yq 'select(.spec.template.spec.containers[0].args != null) | .spec.template.spec.containers[0].args' | \
awk '{
if (prev_line ~ /\\$/ && $0 ~ /^$/) {
print "Found issue: backslash at end of line followed by empty line. Must use pipe character for multiline strings to support kustomize due to kubernetes-sigs/kustomize#4201.";
print "Line: " prev_line;
has_issue = 1;
}
prev_line = $0;
}
END {
if (!has_issue) {
print "No issues found: no backslash followed by empty line";
exit 0;
}
exit 1;
}'
}
# Create all resources needed for openid authentication
function ci::create_openid_resources() {
echo "Creating openid resources"
cp ${PULSAR_HOME}/.ci/auth/keycloak/0-realm-pulsar-partial-export.json /tmp/realm-pulsar.json
for component in broker proxy admin manager; do
echo "Creating openid resources for ${component}"
local client_id=pulsar-${component}
# Github action hang up when read string from /dev/urandom, so use python to generate a random string
local client_secret=$(python -c "import secrets; import string; length = 32; random_string = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(length)); print(random_string);")
if [[ "${component}" == "admin" ]]; then
local sub_claim_value="admin"
else
local sub_claim_value="${component}-admin"
fi
# Create the client credentials file
jq -n --arg CLIENT_ID $client_id --arg CLIENT_SECRET "$client_secret" -f ${PULSAR_HOME}/.ci/auth/oauth2/credentials_file.json > /tmp/${component}-credentials_file.json
# Create the secret for the client credentials
local secret_name="pulsar-${component}-credentials"
${KUBECTL} create secret generic ${secret_name} --from-file=credentials_file.json=/tmp/${component}-credentials_file.json -n ${NAMESPACE}
# Create the keycloak client file
jq -n --arg CLIENT_ID $client_id --arg CLIENT_SECRET "$client_secret" --arg SUB_CLAIM_VALUE "$sub_claim_value" -f ${PULSAR_HOME}/.ci/auth/keycloak/1-client-template.json > /tmp/${component}-keycloak-client.json
# Merge the keycloak client file with the realm
jq '.clients += [input]' /tmp/realm-pulsar.json /tmp/${component}-keycloak-client.json > /tmp/realm-pulsar.json.tmp
mv /tmp/realm-pulsar.json.tmp /tmp/realm-pulsar.json
done
echo "Create keycloak realm configuration"
${KUBECTL} create secret generic keycloak-ci-realm-config --from-file=realm-pulsar.json=/tmp/realm-pulsar.json -n ${NAMESPACE}
echo "Installing keycloak helm chart"
${HELM} install keycloak-ci oci://registry-1.docker.io/bitnamicharts/keycloak --version 24.6.4 --values ${PULSAR_HOME}/.ci/auth/keycloak/values.yaml -n ${NAMESPACE}
echo "Wait until keycloak is running"
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep keycloak-ci-0 | wc -l)
counter=1
while [[ ${WC} -lt 1 ]]; do
((counter++))
echo ${WC};
sleep 15
${KUBECTL} get pods,jobs -n ${NAMESPACE}
${KUBECTL} get events --sort-by=.lastTimestamp -A | tail -n 30 || true
if [[ $((counter % 20)) -eq 0 ]]; then
ci::print_pod_logs
if [[ $counter -gt 100 ]]; then
echo >&2 "Timeout waiting..."
exit 1
fi
fi
WC=$(${KUBECTL} get pods -n ${NAMESPACE} --field-selector=status.phase=Running | grep keycloak-ci-0 | wc -l)
done
echo "Wait until keycloak is ready"
${KUBECTL} wait --for=condition=Ready pod/keycloak-ci-0 -n ${NAMESPACE} --timeout 180s
echo "Check keycloack realm pulsar issuer url"
${KUBECTL} exec -n ${NAMESPACE} keycloak-ci-0 -c keycloak -- bash -c 'curl -sSL http://keycloak-ci-headless:8080/realms/pulsar'
}
# lists all available functions in this tool
function ci::list_functions() {
declare -F | awk '{print $NF}' | sort | grep -E '^ci::' | sed 's/^ci:://'
}
# Only run this section if the script is being executed directly (not sourced)
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
if [ -z "$1" ]; then
echo "usage: $0 [function_name]"
echo "Available functions:"
ci::list_functions
exit 1
fi
ci_function_name="ci::$1"
shift
if [[ "$(LC_ALL=C type -t "${ci_function_name}")" == "function" ]]; then
eval "$ci_function_name" "$@"
exit $?
else
echo "Invalid ci function"
echo "Available functions:"
ci::list_functions
exit 1
fi
fi

32
.ci/kustomization.yaml Normal file
View File

@ -0,0 +1,32 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
helmGlobals:
chartHome: ../charts
helmCharts:
- name: pulsar
releaseName: pulsar
valuesInline:
victoria-metrics-k8s-stack:
enabled: false
components:
pulsar_manager: true
zookeeper: true

View File

@ -0,0 +1,33 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: example
namespace: metallb-system
spec:
addresses:
- 172.19.255.200-172.19.255.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: empty
namespace: metallb-system

View File

@ -1,115 +0,0 @@
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
BINDIR=`dirname "$0"`
CHARTS_HOME=`cd ${BINDIR}/..;pwd`
CHARTS_PKGS=${CHARTS_HOME}/.chart-packages
CHARTS_INDEX=${CHARTS_HOME}/.chart-index
CHARTS_REPO=${CHARTS_REPO:-"https://pulsar.apache.org/charts/"}
OWNER=${OWNER:-apache}
REPO=${REPO:-pulsar-helm-chart}
PUBLISH_CHARTS=${PUBLISH_CHARTS:-"false"}
# hack/common.sh need this variable to be set
PULSAR_CHART_HOME=${CHARTS_HOME}
source ${CHARTS_HOME}/hack/common.sh
source ${CHARTS_HOME}/.ci/git.sh
# allow overwriting cr binary
CR="docker run -v ${CHARTS_HOME}:/cr quay.io/helmpack/chart-releaser:v${CR_VERSION} cr"
function release::ensure_dir() {
local dir=$1
if [[ -d ${dir} ]]; then
rm -rf ${dir}
fi
mkdir -p ${dir}
}
function release::find_changed_charts() {
local charts_dir=$1
echo $(git diff --find-renames --name-only "$latest_tag_rev" -- ${charts_dir} | cut -d '/' -f 2 | uniq)
}
function release::package_chart() {
local chart=$1
echo "Packaging chart '$chart'..."
helm package ${CHARTS_HOME}/charts/$chart --destination ${CHARTS_PKGS}
}
function release::upload_packages() {
${CR} upload --owner ${OWNER} --git-repo ${REPO} -t ${GITHUB_TOKEN} --package-path /cr/.chart-packages
}
function release::update_chart_index() {
${CR} index -o ${OWNER} -r ${REPO} -t "${GITHUB_TOKEN}" -c ${CHARTS_REPO} --index-path /cr/.chart-index --package-path /cr/.chart-packages
}
function release::git_setup() {
git config --global user.email "dev@pulsar.apache.org"
git config --global user.name "Apache Pulsar Team"
}
function release::publish_charts() {
release::git_setup
git clone https://${GITHUB_TOKEN}@github.com/apache/pulsar
cd pulsar
git checkout asf-site
mkdir -p content/charts
cp --force ${CHARTS_INDEX}/index.yaml content/charts/index.yaml
git add content/charts/index.yaml
ls content/charts
git commit --message="Publish new charts to ${CHARTS_REPO}" --signoff
if [[ "x${PUBLISH_CHARTS}" == "xtrue" ]]; then
git push --set-upstream origin asf-site
else
git push --dry-run --set-upstream origin asf-site
fi
}
# install cr
# hack::ensure_cr
docker pull quay.io/helmpack/chart-releaser:v${CR_VERSION}
latest_tag=$(git::find_latest_tag)
echo "Latest tag: $latest_tag"
latest_tag_rev=$(git::get_revision "$latest_tag")
echo "$latest_tag_rev $latest_tag (latest tag)"
head_rev=$(git::get_revision HEAD)
echo "$head_rev HEAD"
if [[ "$latest_tag_rev" == "$head_rev" ]]; then
echo "Do nothing. Exiting ..."
exit
fi
release::ensure_dir ${CHARTS_PKGS}
release::ensure_dir ${CHARTS_INDEX}
for chart in $(release::find_changed_charts charts); do
release::package_chart ${chart}
done
release::upload_packages
release::update_chart_index
release::publish_charts

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF6DCCA9CgAwIBAgIJALU82Re66PvtMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD
VQQGEwJVUzEWMBQGA1UECAwNU2FuIEZyYW5jaXNjbzEWMBQGA1UEBwwNU2FuIEZy
YW5jaXNjbzEVMBMGA1UECgwMU3RyZWFtTmF0aXZlMRYwFAYDVQQLDA1JVCBEZXBh
cnRtZW50MRIwEAYDVQQDDAlwdWxzYXItY2kwHhcNMjAwMzI5MjEwMzA5WhcNNDAw
MzI0MjEwMzA5WjCBgDELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDVNhbiBGcmFuY2lz
Y28xFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAoMDFN0cmVhbU5hdGl2
ZTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDESMBAGA1UEAwwJcHVsc2FyLWNpMIIC
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApndiefjivlz7+UNm/245iZ+o
muNufYw5KTm3mVwg87IJ9897h04j/M0ZRQq6BYnSMMhRBJO+jFjmDPWT51qApfTR
M7+3sNdrVpXeTS21UI4Z4Mfp7pNNWWXd1mrtfqQ+qKZrAzK8i2ce+31uOfv/hZ9t
hT6A16lC+xiM0QFgmOMZ5rfIhnz900wHaDli/4+PmydbYRHBbmG5R+LfzSgYJfly
PcKbZn4TeJgvEQWR/BTugSjuah0yEzqIfrC5OuBypOInnH+08slcj9JU1zoA2Idy
rt14GwLdJjoyT5YfvhWir3fRJh7PKZHjIC4W/SLqLWxwLEUzUzjFu8Vlv63rLvbQ
WM5OdiHlO0vDU30FltNubDrg0Xf4W4WnKkJ/j/vb5r/Gwe4iqoMbdH6SfK270HCk
P8S90Mgwfvm89KS5qJQNGizuCnAFNK4kTLlPMosQVkol4C7rH0svZLBcVgwZmtq5
O1+zznEe9Sxy0ne1SXRcCfP8+lOis/LDRqtTO+rzHdfH7+kyiQvn3Wq69AMbyEmz
ltTOzv8VAEUGvSq4MaLPT+SnqODk9/ZAAEoyjnRqTxDd7dONqj7xc2T7Qa1iqYw1
fm9LG3AKUnJ91Wk/vZ9TlfJ6Heb/NkgZfvByf1NvKDL4oergQXtMn9ZbSFAy87ge
OnsqotIv9K+CMJYQaPcCAwEAAaNjMGEwHQYDVR0OBBYEFAXVbjo175vQXn9g0za3
eFVTNKi1MB8GA1UdIwQYMBaAFAXVbjo175vQXn9g0za3eFVTNKi1MA8GA1UdEwEB
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQB+wBxJ
u7fpSCoEy6WITUS6D++3ZjpbqrkcJZfKE4bFcEuzKRhsJqLJPBHrvjRBnHoJ37Zx
5v641IKOkAxOqmIYwDSD6xEZde4wjZX25cDb+34vj7KwM5V9rs+8bdXZwhU4l5sX
P2wudfortX/L+oBczEOaS9qF7ZdAx20v0PL4X0ExiKFLmlTJdqCMWYwGFoDExWmP
lySfQYo8y/0uxfn5fxqYQB2aG2uMPgZlrL4IdM9YvvJJ3tSTcs7se1/BdhjA1rso
j8oZXi1xGhB565iFMHaHIDzfnG8tsrkdVknWtLJZjmZPFYYFxyqaSFQ+529CTEOY
DNrdR7VECO3uDdgF5yGX08txoHXHCAUpZFKy6kE2F66bASLzkk4/trAbHuENcKAO
FJ0+QP+DFGqpDkJvbEwn3OsDosNW7LSEJkTmEH/qT5ayN6RLXyhMAle8uXo868t7
572vn6aOC1TkQTqtmytZe6DFs+xKnabwLvV91ZWL0LzR2VHBdWglhrrf7m39aKoI
vsm8GgbG3uBA+E71p0TryEhiAZ1ypvbppWbXpuqCqhfCmfkp8U+2O1vdGN6189Nz
pmA78rTNiyUfMpsrgiDovK2v0yDLr7ggMQdA1/JTINBf4sFxx9/auirOZizGSQyF
FFb5n0Nhu7AJwT42rN6wPquzFEXqwkCjWbXMew==
-----END CERTIFICATE-----

View File

@ -1,54 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,85FB9A73260E703BFA595C60A73CC7F8
eurjR7bYyu7RcI5TCnaPW9c7CH4CDOr0FFWzQMkzFrA+RnzRIGRK48GPUDVxrjFR
MVzLQ+k8c7uCXbPLhPlhLsUi/eIDKOAGHQZ2yNJ7P009L34R4mvPoIbuAigvhUdh
lZQ4dSU92JnpY/wlJc3ICZDC1d7tgD206tqfTOGD9csyGEHwtunjvIscFfRNndse
HLjH8YWZnhbN8L6qItZQT88gCQWTE/LfAExV2PCUjMy5enFw49+IrxSEM4UHjuXh
W6FwjGHR5U9rLAn/y0C6r8VgDrW3S3rG/3NeXR5v6k51Ju2ngdb+5rs7FW5PIf2O
lxIvLnQ3p31rOArmL307H52/WWLUKu2vMBJOFtVBNVlcdFBdqUMpo4tpd4jsbbLG
2/hpe5Ym/u132E+y8LJWpREjmzK5j0lYzR9awQPavc3oZ3I4oSCL4xwZvHfmwjL0
LmNYBuL/nfrPZwDzPTFDzsrNCnUiJvxjzVEWOl/dWrUbD7tGFCihr17TajnF2lQZ
stFdcmg7JoAcujkb5KnhPeDDBCfS4wNW2YQwBdDEblJBxzwEThwRjfgMACs9cZ/I
2iNOII5gCsmUWQFTb45kI1OQz+LO7y+6J8rV1h+PjjSzlFZpjc/Sv1LnS9LzaF7a
i/wubGg2ENCBZ3g4rwHK07RVGes5nuM2e0JY7IaxddDDLFpVZosGh8MlBsqGnAc6
nw9h/cftvqmn7aKljS7f0PCCfeKp5q9xIxwE1auaq1WGZTIx9ToKpY677VmoOCuj
sHVUusCTqUQrvTsfHdPF0Wjay+/fYVtCl/WKNrl0ZSq+7Sijh/VSofxSDmVWWvd5
Z/lH9t1CJhnbXVB4eYfmzAdvRRxqlwQI8RADh0w4TvXVnkvjasc8GTkyOcAkQtjo
hoZV82DkrsVZyYUOkk6kxSds1YNTGHpofNLu85d1LbE0hzCbSVDm5YNl6TcIVt/j
rexiCyUdt7OCO99cIinYFFdj2Rdraqqwz8JNxf0MSnHBLxvqbAhsQtsm78UXM6PW
Cs+n8zKdLRELuzTVFu78G0d+XLGVO3LMjEgzbpx8KNJixubUDc4E05sG2wwh6/lU
mM2CRwOdz0EeUceoA6bhHHZm56C18Hw3ZTFwsPO/kQ83RGHRFWeThHNyfyGjF8mA
cuEccnOPI50FmnvBi0n104KdYHAKU+lpBaX331w9xEZT02+Sdy6vlPi+ZPppiFgM
JlfqCi9zoOCwnBKLOspyvzReNQdrSyE6BAJ6pH2qVVVHgxVF7N7aCFArwMqlrULL
HcXWl9DKHrV2irAc/wm0GpdQWdXhDHk/sDmGOwIboi5Dv1zVIW3qnVJjP1eYGuzY
mGb+gSforKFQ/78DErnqTllEcIDw7iFENkX8KJZsPsB9RKaFXgTcr0z+loN+Bwhn
JYj1XW9IgicGAm2hoNNlif2Ntej+5A8XpZL/kidB4x2i/tMAtjpgJtADhaGChgDM
sE3LSnsr6JwuDGpfdzpMgrKnHpjk3fIGfxMN76CW+MnJtgBWgWt0QQUB/MOD34AE
mloev2ddGJwTQCE1T/CIEVxX6/3Sw0sg0xWdYhCY1kGOr9zkkjHa80b1i0e1uT05
1hsIhGKL7KExd11PrLUPM3I6i2GFByTdRrQbPoL3BtiaK9hiUdZZCzeGbOBaWUrn
Jkd24l3+kxg//BpmVniJ7tmAzo8gmSbAe5Pej0cCtZmPzLtUpjoTAyvgu4lw5Xyz
27vIDIsf9sMy3Qyw+OT4ko0EMjbSDlRjnsJ081mOj3HtidjRWL2c+CxKcBn43i6b
kTDrlqmaHpJ1GP8dvBAYG+BUwW5lS3Y7JCze9otoXxGrkS7a4Cr1gN/mN+HBEQJ8
69ZYzELlI8fs2eNH7q8/ZvZ6MJAv25XF9hUIJ7i9ayWsCog0m2DWmEhf42C7SGmf
GD7rOcGapbdqz6AQRqkaY/KDfeQS9oAgdRdjy4xHMKs/2E/oBWEz7KlVoXb7bpVd
K1/DsETTadO46S2tGp4dIj2GHpowztzTDVeHAy2fd0mNoW+GdNinbZdQ+8sgIsH6
6lv/P0PxPFrdKlFUNwAGenaUI21hv33Ety8sBydg5cVkOMFJawR5uwYsGi64wsAm
7bJZSfVspuZxum/68inopZw0Y91/MPbPu6RC1W0sM/EmRNkP07GTUnAxHWhGM1oa
Y8K/NM18Eep7SLORYJIpHHdKD//9NP/r8JYuY91WEVfchIU7/gNvPvLZGrRHI2zB
asjUe5mfBZsvbYt3Trrz9sPHfp9GsvRB5GhasWHjzzs//+hDB0H4MCUoYmk1utTc
6JhdUb3zAySHRFBIy7DLmE/Gg8nS/cn1Rm286dTwNyfoYEjmbj230JjivtTDxJFX
573PA1FfP7t6c6aECERG33Mp0DkglvR5YtC0Fazeefj7s3571EKkaVVfanWV6B8M
wOedZlrNfyKse+fporuxa/IMWJfopywN8zM9LHvV8B1ftZ4JGQgkxRZ9fip5/tWZ
HRNAWaE67VPMAPpR0aE5MC8JRlteSTjM2TFB/qWjko5s1NZsjq7vlQo5whthkAJr
pjT1+FrKSz1uj+lp/82PXwl+6Cs05ki3PdjiQqBaqEY/OByGqLlFn2ZmSPa9OiW+
Nbx2HJauyyC6LqzsqYLs2lwoLpvqU7+yrs3y8q4kcEVoqNngnH9CJoASS1d4zO2n
TIvVuHBYV88JN1rIY++9u68oude3OZDrdCZpuvbsGOm0unG14Zh7BK756bg7LbTO
KehPJ4citigxNdczV9eeSBFSryGefdUT9OXS5SQeza1YE+yOR62Qc4pP7of0g88X
ioIKBoz1fof6etp2X9JX4S9p8li1ZVcdfygGGuwxE5DR2dUlF/AeNmA06bTjZz08
t6UmgivRwFSj8mTLfArrezPnIH3Fa8g77puxBam9TcPIHFSFi8SC3cyaMi/HNbIW
nPSW6w+cU0RFwrMvsOQ4zjIlKNFJFcVUKoZXmKR6v843rg9vrUdJXSiq+gEGSvtA
e/2Jom4HECyXpfVp9ybk7WntjesqUvaWBCHiS8f4G30rHIEHyU1cM68ow5jfxVFc
yLTfrsdximbPcoHisl24H2hy4WNQrCLDNb4we1MZa9mqby8BsSwh9li3axB6Y0e5
-----END RSA PRIVATE KEY-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF1TCCA72gAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgYAxCzAJBgNVBAYTAlVT
MRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQx
EjAQBgNVBAMMCXB1bHNhci1jaTAeFw0yMDAzMjkyMTAzMTBaFw0yMjEyMjQyMTAz
MTBaMG8xCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRUwEwYD
VQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGTAXBgNV
BAMMEHB1bHNhci1jaS1ib29raWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC2YDyQkP85nwfS2yrqEkpPkPaTuIn7YsHRUsfveEgdva87qDvl2lwaLft5
150Ehvf6uRgi3+xlEynAj2ZOtF/GXH0ipv5kOKL5HDvvFRmp7FwR2i2SLPM1rasw
JYpmTc+aUBV4qvXUWzLPcTAY1UdPCIEyH2Mc35un1N8Zx7USASkKHrObzE5F/tiD
2rDdJ3UXtovS5MuJtx5VqMjc2zmqqCgC5h38E812Jn1zbXSFvpL6obwaL0rq4h8T
SCgVzz3ovbISgqF6h6HRB8kb8VZ7mR6SUfM87Lbs/05zUBE5bk9O9j7Mf51j1nnj
iD1P7qoqmjufvmnFIg1iSayINw+FAgMBAAGjggFnMIIBYzAJBgNVHRMEAjAAMBEG
CWCGSAGG+EIBAQQEAwIF4DAzBglghkgBhvhCAQ0EJhYkT3BlblNTTCBHZW5lcmF0
ZWQgU2VydmVyIENlcnRpZmljYXRlMB0GA1UdDgQWBBQ3ETJxE56xvo9gQ129aLcD
tEiIJTCBtQYDVR0jBIGtMIGqgBQF1W46Ne+b0F5/YNM2t3hVUzSotaGBhqSBgzCB
gDELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDVNhbiBGcmFuY2lzY28xFjAUBgNVBAcM
DVNhbiBGcmFuY2lzY28xFTATBgNVBAoMDFN0cmVhbU5hdGl2ZTEWMBQGA1UECwwN
SVQgRGVwYXJ0bWVudDESMBAGA1UEAwwJcHVsc2FyLWNpggkAtTzZF7ro++0wDgYD
VR0PAQH/BAQDAgXgMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB
BQUHAwQwDQYJKoZIhvcNAQELBQADggIBABJSPJJRDj1bB8d8Z1ZCSqeJsLeA8Hi6
Vdoe4lrHYUXIyleI05e6Ya21r638PUhJo9HWNiUFYkRmqrCTZyuk1UIVc+6Mx5LP
WeNrkEIwLwSZlde0OgdEyKTJXKZhMDMUkGaoscl+JHbCDhkkPV3M01KxAFq2zZ9e
zwVZTnRh1x/engidcR1uxS055UqkOtyqp19KPfaXOuIl2R/JVEyHq7yNHUGLu9wM
0LGh17yBxyJcahLqGK2IWty+V8Snwfy6CQLoLUv9CNdVbWWd7/cGQUm2OvzIQEmb
rw96pD7lM182cjbt616/hrES9lBcsaCMN97QG0ZPT2QQL1y3ci/Din7vzbjN2UNL
7W3zUa1niFZDz6DpfP7gdsKkc4/weBRHglghfHhUJk15IBn+vCG2wiDXpWgm4AjJ
UNBB7Yco8wBApt7+xZd2QLtKlGGxV+FR6GeuiiOeA9r/XC2p1b7zj3e5x9F4Zo5a
80An42PyNZCTnGQzWUTfo2aRhLiUwNYXg+PFbA2j6EDgR7G38Vr/z7omdUjqYE+s
4qVPU5kkz3H6lkfGfRiTooQk5zD9fSIgJc0oculARKgitpHaMdn2MKC4+1om3YKc
WiOHdVpZzNkjjq6JbuY24EGEBACllehnqmJh2ku6eMIydSPUh2KgHPWUgdMfyzR/
AzoXnRPk7pjh
-----END CERTIFICATE-----

View File

@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICzTCCAbUCAQAwgYcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNp
c2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRp
dmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGTAXBgNVBAMMEHB1bHNhci1jaS1i
b29raWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2YDyQkP85nwfS
2yrqEkpPkPaTuIn7YsHRUsfveEgdva87qDvl2lwaLft5150Ehvf6uRgi3+xlEynA
j2ZOtF/GXH0ipv5kOKL5HDvvFRmp7FwR2i2SLPM1raswJYpmTc+aUBV4qvXUWzLP
cTAY1UdPCIEyH2Mc35un1N8Zx7USASkKHrObzE5F/tiD2rDdJ3UXtovS5MuJtx5V
qMjc2zmqqCgC5h38E812Jn1zbXSFvpL6obwaL0rq4h8TSCgVzz3ovbISgqF6h6HR
B8kb8VZ7mR6SUfM87Lbs/05zUBE5bk9O9j7Mf51j1nnjiD1P7qoqmjufvmnFIg1i
SayINw+FAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAfqkDkMzdfp43gZeqX5WH
yTO3K0eBJAsCNSP9RvjrYjZdMja34mXac5JkMa1j1cs19IthLCPZ2T4SBJpd5SQX
vkXhCkHkS5WR0Nrvb3cpsjUEKbp6yIBE8bLCal6eUkZOyYM6w+gr4fN4WEt+c0fC
n5n8Ox4lK3yFmRlgQFYkGWBaZVIEUYJVUFIT8M7AHkKf5TqC5RVGMgLiP0+CYM9R
xe1hIIjiifgtKx2w3VJJ8Jmmkw8Fax1ynu7+sGaAswZp0lJsMSQUCLjDvaRNhfRL
+qZ4p+C5x9s20XTD8FmzEzwTcqhVQU2jjFq8zVlea3PVHr39+AbLez4jq7uLCeWQ
5Q==
-----END CERTIFICATE REQUEST-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2YDyQkP85nwfS
2yrqEkpPkPaTuIn7YsHRUsfveEgdva87qDvl2lwaLft5150Ehvf6uRgi3+xlEynA
j2ZOtF/GXH0ipv5kOKL5HDvvFRmp7FwR2i2SLPM1raswJYpmTc+aUBV4qvXUWzLP
cTAY1UdPCIEyH2Mc35un1N8Zx7USASkKHrObzE5F/tiD2rDdJ3UXtovS5MuJtx5V
qMjc2zmqqCgC5h38E812Jn1zbXSFvpL6obwaL0rq4h8TSCgVzz3ovbISgqF6h6HR
B8kb8VZ7mR6SUfM87Lbs/05zUBE5bk9O9j7Mf51j1nnjiD1P7qoqmjufvmnFIg1i
SayINw+FAgMBAAECggEBAKl2AtDR6lXAT6S9wcJ9/E6yhGv+rTfJLA80vFLnkRsR
hiII0J9jpvEsiN9OWbg7MXDnTGYba6z/gWxL0uSO9e97QUtRoE+/0K9obMha8t3R
ojt0X6PT4KmgFdFHELK+2oiooUrekE4h77SRl/97Lidh36qTP6U0oY3xXty1lKqE
lrgqWntmwJnRl9H/kykrnfVVd/BiWkJ2kDktTwwAM2MPrUpENk7B0Q4ToCwTMI2I
QHz5/khBGX6OCjFXAOCLRH3xcR0GH+vAhRt9PUERMlAiQJv5YJz6v31iU5djCznN
xug0NFysIvzg6+kqP027GIaXc1BieerXrVDahd1UhAECgYEA6ZQmNbOD30Y5Lhrj
QN0t6ZRaI8LrugKx9d8mb7SqIsAVroCGHJAwp4NQCMaYwsnrL6QIIb8bnX58fydR
TK43sT6NDeShhCiNQyPgDn6xzFr5//FIyfIVHDfnIeCKdlWQKwZZSIWgmg72Xm7+
YrYj9899DS6MO7LBngPK9h+QhUkCgYEAx+Ha0Ww/CJ+lK860BOG2QLaq6bgnB/S4
q2xuIpF11YYRzPCcigS9e3B2v72zE8yJeaW5PHLBecR6kuAfANaGCkWbqNOmeYdh
4f0v9yhJJNMu/YsiMnsFffPGckiNxDPN/u2PhiWkOi37PoYRaz+Mp5Y80f2utM8s
z4SqvbUVhF0CgYABCJjKsAqrWEI0hAXxaYkkeXWUpu4oGo7zCZO/9sqx8Kun5AWz
5qdwdlJKV6ahZgdWZKFslM3oeoDOhzwC3Np+PEqffx1/2jYVz/jT15et0dE9YrHx
wtJ5F348ViQGtgY3SoXmnkDBrcNFU7Rod2ndVNu2zTfto7LboiSpxiX7kQKBgELn
7efl1N+dGJumUAnGR8w3mNQs6Ru3pczzuZXmnMvBWdoAvFVSqt5T0dvysquw7l+C
wpNiUjLhOqpJTPdp12o+zJDhb7sEPxZ3OoP/vyQNcJA771F4bmkvnUCJ2rJPKOfp
Ov6LQQKce5n9JH2CwyEhn/Ame0FYi8ZWwRRJNg+dAoGBAM7sk+DWoHPeYunjbEVT
/Uehevoc417YIzlIN0XB2QGyNAVgidOUO+vrpCYfQlnQqUTXXfzF3WhdAcEqCiqt
nsteKiG/i7v+lULxGepxvj6hUW616LowqqXCmFqfEc8J/QrnKhO1j7IWUn8qytRh
FPEJD9tESETYG6+CiiMndZG4
-----END PRIVATE KEY-----

View File

@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtmA8kJD/OZ8H0tsq6hJKT5D2k7iJ+2LB0VLH73hIHb2vO6g7
5dpcGi37ededBIb3+rkYIt/sZRMpwI9mTrRfxlx9Iqb+ZDii+Rw77xUZqexcEdot
kizzNa2rMCWKZk3PmlAVeKr11Fsyz3EwGNVHTwiBMh9jHN+bp9TfGce1EgEpCh6z
m8xORf7Yg9qw3Sd1F7aL0uTLibceVajI3Ns5qqgoAuYd/BPNdiZ9c210hb6S+qG8
Gi9K6uIfE0goFc896L2yEoKheoeh0QfJG/FWe5keklHzPOy27P9Oc1AROW5PTvY+
zH+dY9Z544g9T+6qKpo7n75pxSINYkmsiDcPhQIDAQABAoIBAQCpdgLQ0epVwE+k
vcHCffxOsoRr/q03ySwPNLxS55EbEYYiCNCfY6bxLIjfTlm4OzFw50xmG2us/4Fs
S9LkjvXve0FLUaBPv9CvaGzIWvLd0aI7dF+j0+CpoBXRRxCyvtqIqKFK3pBOIe+0
kZf/ey4nYd+qkz+lNKGN8V7ctZSqhJa4Klp7ZsCZ0ZfR/5MpK531VXfwYlpCdpA5
LU8MADNjD61KRDZOwdEOE6AsEzCNiEB8+f5IQRl+jgoxVwDgi0R98XEdBh/rwIUb
fT1BETJQIkCb+WCc+r99YlOXYws5zcboNDRcrCL84OvpKj9NuxiGl3NQYnnq161Q
2oXdVIQBAoGBAOmUJjWzg99GOS4a40DdLemUWiPC67oCsfXfJm+0qiLAFa6AhhyQ
MKeDUAjGmMLJ6y+kCCG/G51+fH8nUUyuN7E+jQ3koYQojUMj4A5+scxa+f/xSMny
FRw35yHginZVkCsGWUiFoJoO9l5u/mK2I/fPfQ0ujDuywZ4DyvYfkIVJAoGBAMfh
2tFsPwifpSvOtAThtkC2qum4Jwf0uKtsbiKRddWGEczwnIoEvXtwdr+9sxPMiXml
uTxywXnEepLgHwDWhgpFm6jTpnmHYeH9L/coSSTTLv2LIjJ7BX3zxnJIjcQzzf7t
j4YlpDot+z6GEWs/jKeWPNH9rrTPLM+Eqr21FYRdAoGAAQiYyrAKq1hCNIQF8WmJ
JHl1lKbuKBqO8wmTv/bKsfCrp+QFs+ancHZSSlemoWYHVmShbJTN6HqAzoc8Atza
fjxKn38df9o2Fc/409eXrdHRPWKx8cLSeRd+PFYkBrYGN0qF5p5Awa3DRVO0aHdp
3VTbts037aOy26IkqcYl+5ECgYBC5+3n5dTfnRibplAJxkfMN5jULOkbt6XM87mV
5pzLwVnaALxVUqreU9Hb8rKrsO5fgsKTYlIy4TqqSUz3addqPsyQ4W+7BD8WdzqD
/78kDXCQO+9ReG5pL51AidqyTyjn6Tr+i0ECnHuZ/SR9gsMhIZ/wJntBWIvGVsEU
STYPnQKBgQDO7JPg1qBz3mLp42xFU/1HoXr6HONe2CM5SDdFwdkBsjQFYInTlDvr
66QmH0JZ0KlE1138xd1oXQHBKgoqrZ7LXiohv4u7/pVC8Rnqcb4+oVFutei6MKql
wphanxHPCf0K5yoTtY+yFlJ/KsrUYRTxCQ/bREhE2BuvgoojJ3WRuA==
-----END RSA PRIVATE KEY-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF1TCCA72gAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwgYAxCzAJBgNVBAYTAlVT
MRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQx
EjAQBgNVBAMMCXB1bHNhci1jaTAeFw0yMDAzMjkyMTAzMTBaFw0yMjEyMjQyMTAz
MTBaMG8xCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRUwEwYD
VQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGTAXBgNV
BAMMEHB1bHNhci1jaS1icm9rZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDTlckitxCrXIgI0ti5QNL/HHXGuWtIPUGufU+oSqaqsl7y2EGe0he2TuBP
bQleWdHYatw7ICftlp9kDIOt4T2jOMXxA4j/l5Ve5eeG+tLigOpTRP+F/A/2dEl+
LgjocfWeec2ES6gvMeC0G79P/nstes8+0ezgo70SG/sAMFb1ni2cs/kwVtio9lhR
FdYTJQ88u7Qenw4E0CEa+uoDGlz+tm8BJjPMV9RWBkOSHK1IU6JfKTlAR56VQ9yR
x1Z9UABsbRRu3oZQLSWjANpWPsPIR0zecd7QujzW0E3kWTA4Y9Mb7hX03AFOoiBC
nSSh3gw5JBcTlwC448Kqp08ungSBAgMBAAGjggFnMIIBYzAJBgNVHRMEAjAAMBEG
CWCGSAGG+EIBAQQEAwIF4DAzBglghkgBhvhCAQ0EJhYkT3BlblNTTCBHZW5lcmF0
ZWQgU2VydmVyIENlcnRpZmljYXRlMB0GA1UdDgQWBBRYpYCpJRoyONrzTNTRzAiS
Jd1u+jCBtQYDVR0jBIGtMIGqgBQF1W46Ne+b0F5/YNM2t3hVUzSotaGBhqSBgzCB
gDELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDVNhbiBGcmFuY2lzY28xFjAUBgNVBAcM
DVNhbiBGcmFuY2lzY28xFTATBgNVBAoMDFN0cmVhbU5hdGl2ZTEWMBQGA1UECwwN
SVQgRGVwYXJ0bWVudDESMBAGA1UEAwwJcHVsc2FyLWNpggkAtTzZF7ro++0wDgYD
VR0PAQH/BAQDAgXgMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB
BQUHAwQwDQYJKoZIhvcNAQELBQADggIBAJxMGV3o9ukexBNCJBcR1pn9GRh+ti8j
BxtDpPEnkwh0y6g/nAKR3HC2KHc05BpdeZ1TOqmLMaIbuVd9/xNpk6HQ1p3vJfw7
x21r7MVsc2XZo1/FiHH8BeIY+46rJlfBNuARIvaEsxT32aeBGcSZ7wFmWuY3pRIc
rUkUxlNb28JhKLiYXt1P6Irno9HFPH2w8meYRdG3gbsGul8OutAsoZpI5Ab+qWP0
kO+BwVmf+YQ1BrlEm+rEyhmk5ewWGPSZ5Cp8ZtQZNsRai1FkyjTtqOy1U+kJad6c
Dy1rBnVumDy2hcWmaPgCuGR8qulXt+yTas7vtwiWzKibT752XJcZHOJcIoB25ens
XkDbF43YSqa7ZIXJITaSeZDLu2A8e5Gvuzmlv00YTPQFhnLUOFSYZ5swOQ0v4L+J
B78gvkuHhLxOVwh61AAKrBTBu6GTf5ajrgZDnnrXx1oB2OxMD2uCzepOf/OROXdf
+o2i1mjO9V7bF1pnXWlfRyGmFZEe3OoxvWqqP1KOHdGrFOkSVVFIKG4yTyV7BFR2
uX9pyBYL7SPNUizJbSK7mxBPuQNNtE2cwNfCqB4kt11Q6yCvqPkbT2b/DmbMY60p
kHsqxsMnaFjvZAlb7P+732qTXaVJTWEX/ksVFzGJwuxN24NqxJlf3wUSgzDhCj1K
p4Bqaa6+GG6P
-----END CERTIFICATE-----

View File

@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICzTCCAbUCAQAwgYcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNp
c2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRp
dmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGTAXBgNVBAMMEHB1bHNhci1jaS1i
cm9rZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTlckitxCrXIgI
0ti5QNL/HHXGuWtIPUGufU+oSqaqsl7y2EGe0he2TuBPbQleWdHYatw7ICftlp9k
DIOt4T2jOMXxA4j/l5Ve5eeG+tLigOpTRP+F/A/2dEl+LgjocfWeec2ES6gvMeC0
G79P/nstes8+0ezgo70SG/sAMFb1ni2cs/kwVtio9lhRFdYTJQ88u7Qenw4E0CEa
+uoDGlz+tm8BJjPMV9RWBkOSHK1IU6JfKTlAR56VQ9yRx1Z9UABsbRRu3oZQLSWj
ANpWPsPIR0zecd7QujzW0E3kWTA4Y9Mb7hX03AFOoiBCnSSh3gw5JBcTlwC448Kq
p08ungSBAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAX1WCH+wJ4znyeDPGwJe/
jVTxHnZu4IY12rspo5zlK+qto33M9hD12ZwQJ8sg/zpXUsCwM4gA6HhOeiQPz69g
vz0UJyv6YsfeVjPF9d/0TywMx0idxb04bQe0W2pLBRrtTvvm22uEbpKrj9QICnmS
nwRjcciD8LBuLfUrR9kPkZnD51PCPGvQpx7mDWt3tAwdfR1sf0w6bwlPx0eqRpyl
Fz+Kz7bWTCLBTZ6nsFyDdVNVLCPk6fPoPdSefWS+1za8I9/C28oIfYuqPkc9ULx7
LZbuGyJU4rC4HxKSPcqmDy12TCSBvDcUMBfQ8d4LkbOIYnaW7aE3JBShTvgMzMOR
TQ==
-----END CERTIFICATE REQUEST-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDTlckitxCrXIgI
0ti5QNL/HHXGuWtIPUGufU+oSqaqsl7y2EGe0he2TuBPbQleWdHYatw7ICftlp9k
DIOt4T2jOMXxA4j/l5Ve5eeG+tLigOpTRP+F/A/2dEl+LgjocfWeec2ES6gvMeC0
G79P/nstes8+0ezgo70SG/sAMFb1ni2cs/kwVtio9lhRFdYTJQ88u7Qenw4E0CEa
+uoDGlz+tm8BJjPMV9RWBkOSHK1IU6JfKTlAR56VQ9yRx1Z9UABsbRRu3oZQLSWj
ANpWPsPIR0zecd7QujzW0E3kWTA4Y9Mb7hX03AFOoiBCnSSh3gw5JBcTlwC448Kq
p08ungSBAgMBAAECggEBAJXSLFhelHkizlihJEEZO87VEjijNuoyJf4uUWdzZMzd
/QmsQ9r4HT5EX+Ud6lJa+5JpKITdYiiETV0E14EaSxD2tILS5AFIDsbhuK4Fkao9
aq+H3f+72nnDIf8tDbW6bBfJW9Nf1zmD8f7W3wL/ya0Mlw9+imMOzmSyV2tsz0af
btAHOxY92veHL1bi44MNf0s90AicpT3xmFFUYB0KyS7DfxXhFjTRo5zTDVISDGev
mpzkbebOTox4y4eGjzydPmiIyTsEKu6aCdSn5zcQT7ooK4We0E24/U10HYQcbE5B
dzw7VEcyuBLsY+bgie2rDstc1xGPqFng+gJ6m9rnAAECgYEA9XHjjdheuyHAgx+6
nW8xJvQ9AL3ZxTP+3pMhPFUMHDWtNT1p1LvhUHHDC8na/CMzzGp9YJvZEZFNyWB5
f54K0UzkKY24E3WxiVCv9L2XUX01pPsiZPJg9truW0APfguxIkikURuYggnQ8ix+
jlmalvGVe5iIX7my0AhrVTViuAECgYEA3K8iIo+8cSEIRcM+w8onmGZYIhTTjQ1I
9MDo0aD5/sFD2FidbFOZlj+DaEyoIZs+hF0SQwFUOsJ+pGLGmlxC1uSfbR1iCdj8
8A8BOlX745x13BvJbMIhTAnjAz7IunIWDqbxdSHHR6zbNFty4tyQfQW8YZDjNtyE
nLBxArE/TIECgYAdoao/LagCH4kGS4ZUC2B7u3DB7imkTSqv5ENW7U2Q+kn263sj
W6tP8uwBOFVfq0BNpW2NhEMog8pITYVdis7zhbzl514Zu1O7qCoV+e2SwPMA//Cf
D0P1iWjNS2aTaQXxhaOQxywaRuUa15RPyzGGl5PcYAXWyKx1wQ50MwXAAQKBgB5+
lNjxw7heOCZrtGCZrp8AhW0wM4tqKoqnnYRaGjF5w0ZB+H7fjnmUjTP8Y79BFIJ1
2fAoXts/xQAyJf9ugE3xiZYqWUHDGjCR4jmNaCErnZ2suUiuCqvXMedg5Zvd5+5e
Yz8sS707xY6WlGmE0PJ1uHJC8yLBlhGQ0AzvMTABAoGAHpGyIWAemC6XFpjS0YDa
TgdJjue47kSeLlwAfuYAI/DWMfQr+nYomxLipvOy7PwxmbAWVeJB8t+XthW1oR7q
gb22NpD1d/ZmJLDqP8c0RaIiJvH4n0OeMSdTyQKHbLyZAPttZCNlaVoLNwyVhSdT
/d7lZb8YU2u/PpNSKbxt65M=
-----END PRIVATE KEY-----

View File

@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA05XJIrcQq1yICNLYuUDS/xx1xrlrSD1Brn1PqEqmqrJe8thB
ntIXtk7gT20JXlnR2GrcOyAn7ZafZAyDreE9ozjF8QOI/5eVXuXnhvrS4oDqU0T/
hfwP9nRJfi4I6HH1nnnNhEuoLzHgtBu/T/57LXrPPtHs4KO9Ehv7ADBW9Z4tnLP5
MFbYqPZYURXWEyUPPLu0Hp8OBNAhGvrqAxpc/rZvASYzzFfUVgZDkhytSFOiXyk5
QEeelUPckcdWfVAAbG0Ubt6GUC0lowDaVj7DyEdM3nHe0Lo81tBN5FkwOGPTG+4V
9NwBTqIgQp0kod4MOSQXE5cAuOPCqqdPLp4EgQIDAQABAoIBAQCV0ixYXpR5Is5Y
oSRBGTvO1RI4ozbqMiX+LlFnc2TM3f0JrEPa+B0+RF/lHepSWvuSaSiE3WIohE1d
BNeBGksQ9rSC0uQBSA7G4biuBZGqPWqvh93/u9p5wyH/LQ21umwXyVvTX9c5g/H+
1t8C/8mtDJcPfopjDs5ksldrbM9Gn27QBzsWPdr3hy9W4uODDX9LPdAInKU98ZhR
VGAdCskuw38V4RY00aOc0w1SEgxnr5qc5G3mzk6MeMuHho88nT5oiMk7BCrumgnU
p+c3EE+6KCuFntBNuP1NdB2EHGxOQXc8O1RHMrgS7GPm4Intqw7LXNcRj6hZ4PoC
epva5wABAoGBAPVx443YXrshwIMfup1vMSb0PQC92cUz/t6TITxVDBw1rTU9adS7
4VBxwwvJ2vwjM8xqfWCb2RGRTclgeX+eCtFM5CmNuBN1sYlQr/S9l1F9NaT7ImTy
YPba7ltAD34LsSJIpFEbmIIJ0PIsfo5ZmpbxlXuYiF+5stAIa1U1YrgBAoGBANyv
IiKPvHEhCEXDPsPKJ5hmWCIU040NSPTA6NGg+f7BQ9hYnWxTmZY/g2hMqCGbPoRd
EkMBVDrCfqRixppcQtbkn20dYgnY/PAPATpV++OcddwbyWzCIUwJ4wM+yLpyFg6m
8XUhx0es2zRbcuLckH0FvGGQ4zbchJywcQKxP0yBAoGAHaGqPy2oAh+JBkuGVAtg
e7twwe4ppE0qr+RDVu1NkPpJ9ut7I1urT/LsAThVX6tATaVtjYRDKIPKSE2FXYrO
84W85edeGbtTu6gqFfntksDzAP/wnw9D9YlozUtmk2kF8YWjkMcsGkblGteUT8sx
hpeT3GAF1sisdcEOdDMFwAECgYAefpTY8cO4Xjgma7Rgma6fAIVtMDOLaiqKp52E
WhoxecNGQfh+3455lI0z/GO/QRSCddnwKF7bP8UAMiX/boBN8YmWKllBwxowkeI5
jWghK52drLlIrgqr1zHnYOWb3efuXmM/LEu9O8WOlpRphNDydbhyQvMiwZYRkNAM
7zEwAQKBgB6RsiFgHpgulxaY0tGA2k4HSY7nuO5Eni5cAH7mACPw1jH0K/p2KJsS
4qbzsuz8MZmwFlXiQfLfl7YVtaEe6oG9tjaQ9Xf2ZiSw6j/HNEWiIibx+J9DnjEn
U8kCh2y8mQD7bWQjZWlaCzcMlYUnU/3e5WW/GFNrvz6TUim8beuT
-----END RSA PRIVATE KEY-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF1DCCA7ygAwIBAgICEAQwDQYJKoZIhvcNAQELBQAwgYAxCzAJBgNVBAYTAlVT
MRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQx
EjAQBgNVBAMMCXB1bHNhci1jaTAeFw0yMDAzMjkyMTAzMTBaFw0yMjEyMjQyMTAz
MTBaMG4xCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRUwEwYD
VQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGDAWBgNV
BAMMD3B1bHNhci1jaS1wcm94eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAO/KwkV8NT96A0pn/Y5DlUffefTLHkVgTYocj4s8CeDS67XsZ4he/+ekn3uR
y4ze6kwA+qI8jxE7zycnBA3Dq01pG//com9nilcm1coDJrzIZSTnz1kQKOZwBoFM
1kknpDNHGBvwSwCAFbhCtQtScnsa2InN0F2lgzEJmaS/HE0OTKGOrTlC+9qbKpA5
kQtmdhs7p3IoYRbiNZMO7ZPxXZpxEy0EaAbTeCYpmkaBUKsW3tuwdLztmyHgT3iw
y3YQcZV2tCyNyBp6bHsXp9BfhAzwehl0vSfL/3GmMLcpTH2rIhLrNL+jFpfUWOxP
qHXvhAl5VNOkw182lYvlABb3I0ECAwEAAaOCAWcwggFjMAkGA1UdEwQCMAAwEQYJ
YIZIAYb4QgEBBAQDAgXgMDMGCWCGSAGG+EIBDQQmFiRPcGVuU1NMIEdlbmVyYXRl
ZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFAgm3jyic7NMgR4LrVWbE3pG
qcbKMIG1BgNVHSMEga0wgaqAFAXVbjo175vQXn9g0za3eFVTNKi1oYGGpIGDMIGA
MQswCQYDVQQGEwJVUzEWMBQGA1UECAwNU2FuIEZyYW5jaXNjbzEWMBQGA1UEBwwN
U2FuIEZyYW5jaXNjbzEVMBMGA1UECgwMU3RyZWFtTmF0aXZlMRYwFAYDVQQLDA1J
VCBEZXBhcnRtZW50MRIwEAYDVQQDDAlwdWxzYXItY2mCCQC1PNkXuuj77TAOBgNV
HQ8BAf8EBAMCBeAwJwYDVR0lBCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEF
BQcDBDANBgkqhkiG9w0BAQsFAAOCAgEApIwUVqrr3yWLhRitLvuJcwWz6fQ6WL3c
RgYBw/Q9wXCq77mAxUCEVz6zF0FklNE9N3I0mQZC01Wp7JqvNFv4/9H5V02gzmFz
m2gHIRs6hPz3gTkZNzP7vLBHe560pE0jkFD5b73esdYhr4F1U4829jV9D5IawoMa
k/Yx5HxQX9ESRiPsw1SaMVR33k7GKYieg6Effj1d3N0Y4/+yVOZuWOVAv0GgVTIx
271TDc1MrKYbYW+9qzkL5w8zOP3BbXwDxtQFAhiD82NjQU0/88WMC3I3f2oZ6jkh
ZG3vF0ssM2LnnuoMCTynNvP4VJRXY721EOmw6ev/vapPmEIMSJaSDD6h4SiuQxKM
OPHGk3ETTciYVDefCQca7UFMP+DlyJRRV2JmDdW2JvrfSVLxbhtEArgyeZnuDIGR
fyeB6lO2mP/Pe2sUsd0FJpz2uB/JaNalTiCS0RpXvIIQUIiOpLeWa6N1NUtVtLow
8mqmipieMdjjGEDHGZ8j2PXIIox5mWbcWAIvxJOZhJ8jZdBDbJB4fHw5lpTrcrxx
NgnLFVlGyjGGDtZZig0fMN2QMt8SX9W8i3beqAK3Vsb8myxGJSH6/zulg4mt8hH1
Rwis+P4vSkcPC8hcJoacVXEj4gMCxp2jDzslVE4jQwug+2b0qhW1500/JsKj5E7+
ylzn5KM9OFE=
-----END CERTIFICATE-----

View File

@ -1,17 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICzDCCAbQCAQAwgYYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNp
c2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRp
dmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGDAWBgNVBAMMD3B1bHNhci1jaS1w
cm94eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO/KwkV8NT96A0pn
/Y5DlUffefTLHkVgTYocj4s8CeDS67XsZ4he/+ekn3uRy4ze6kwA+qI8jxE7zycn
BA3Dq01pG//com9nilcm1coDJrzIZSTnz1kQKOZwBoFM1kknpDNHGBvwSwCAFbhC
tQtScnsa2InN0F2lgzEJmaS/HE0OTKGOrTlC+9qbKpA5kQtmdhs7p3IoYRbiNZMO
7ZPxXZpxEy0EaAbTeCYpmkaBUKsW3tuwdLztmyHgT3iwy3YQcZV2tCyNyBp6bHsX
p9BfhAzwehl0vSfL/3GmMLcpTH2rIhLrNL+jFpfUWOxPqHXvhAl5VNOkw182lYvl
ABb3I0ECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQDZkKjsOTvDQPoXfOldcZ9J
DipCf83JI+J5tEmQvYW8FJlBfmEZUiewQmDuoy5RMpIejic4wjthU4xK+siSFzkf
PUWAXzbx0oD8Y9vazFqQTmEIEbHWnWW84t5ocn9o0ZKLXSukzz/QVF1XXtquzo+n
KRWiaMFVR+1Jw1KWPDcHK1uTvo8IsqKWin5JSkewbYJB1/HKt4OlJB6KxfI61X5L
Kklx21SIPwCCQa+8l9sA3ONtmtEYSSsRxX6gbnwMpc8zZioaY5PO54wVgifjyNR/
myjWjWi5jJE2AN4VMFmt/mvvcNz6x1RjzC5sQ6HsB7wyRZU1ybyb/oQzAi879v2n
-----END CERTIFICATE REQUEST-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvysJFfDU/egNK
Z/2OQ5VH33n0yx5FYE2KHI+LPAng0uu17GeIXv/npJ97kcuM3upMAPqiPI8RO88n
JwQNw6tNaRv/3KJvZ4pXJtXKAya8yGUk589ZECjmcAaBTNZJJ6QzRxgb8EsAgBW4
QrULUnJ7GtiJzdBdpYMxCZmkvxxNDkyhjq05QvvamyqQOZELZnYbO6dyKGEW4jWT
Du2T8V2acRMtBGgG03gmKZpGgVCrFt7bsHS87Zsh4E94sMt2EHGVdrQsjcgaemx7
F6fQX4QM8HoZdL0ny/9xpjC3KUx9qyIS6zS/oxaX1FjsT6h174QJeVTTpMNfNpWL
5QAW9yNBAgMBAAECggEACCm32VO0IFgP+p11pT0pvMufxDSR8DyqBxSX0l6V24By
o7vLfnn1bjZNc5BwBHimMzYpUhKLsEN/9s4+NhW+JCF64YfqQ66bqAHbb0gSLoUH
5Gy7w0VojwerQQWTmePulAxMhs70Tq0NkDs9HIiO+x/b1T0bZcS3pZi1EUWsOfc8
xjCbEvbdvRK1R3tjZExxdRx5FR7sMuZ0Q2PhWbRymSRlNW7mX+aaCUqWQLOgqWkL
UZVl3ekljXTc+da3PxqDciHyPdYbXgVgBwKJoE8FXq1Sj7usjbrX/k+xigtA2MMW
lxA4y9CU6Bd5yTx2FySgYvGbyTt+5g6nm8rQJamgAQKBgQD/V3ZBT55oqS9Y6SpA
Rr2W89Yt66hkcJGjfHkc/onR1uyuYncNHXC3WQi8xeezzsgX4quhLSr5501iedJY
faV+s0YBDJ5kYsRxzU8iUK8CBCYfwV6EXnKvR8LmqPot7ZcONaQVngAcmkEN+9pl
FbWZeJuSaBPzjgQNBwgypA/EgQKBgQDwaQiOYtKB/O4+3qKqMR1AvWDc0/QS7kz+
qBFP4qb3VBlLc60peosJVWBB/MUPX5ybTANl1Ah1GMpp387VcZ4tcexEiKiuofBD
19SclJ0nEycn2WEeWTIZ/EErVVnRViOHKt5CWry2NnIlGx2PJ3WGGNd6uMIF6giw
ZkqfRBz+wQKBgQCfYizCn7w1gEW5rfFdpcp6C0JJ76tw5oNCFVRUMN4+SXX7dCLz
4MiW6dB2ZOI4bn6fyjFvrg4BZ8v6CCiwa919tNGhngrQhoYwswMOXGahT42sjLs+
zOWxW43hBOEFAiUkDX+arsFLGU46OFceeeqdHZeeT7EEekU1DIqlcZsWAQKBgDFD
9OLo0Wad5Fyx1ve1dN8tb8oRDTVL7C9LVbDfK4QHkd9qZxPW7uMMwdsD54YM+9S/
MPsPBmSoneIwYPxQei+p5tbsglS3Drt4YTNtKP8255E89K/5a1Dz5o7wwKUrV8B9
QmqqmX1ljuKXuej6FxVRxeZ6MhhwKzOq4qPcm2yBAoGBAMYUTcqxH5/Dqwx781/Z
W753xja6LN1gRSKOHaoUiQo/2FKSXj7fT/ZAWJwiivndoVreiz5lK9FPnPJj67HA
J+x2z2oiNbVyv7F2RnEuFxw4yeWO4wfNdEZ15DGHbIdD2nM9SvhwlMJ2rRD+O0Qa
nlve8+9e/rf+fM1ml2dYFqwZ
-----END PRIVATE KEY-----

View File

@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA78rCRXw1P3oDSmf9jkOVR9959MseRWBNihyPizwJ4NLrtexn
iF7/56Sfe5HLjN7qTAD6ojyPETvPJycEDcOrTWkb/9yib2eKVybVygMmvMhlJOfP
WRAo5nAGgUzWSSekM0cYG/BLAIAVuEK1C1JyexrYic3QXaWDMQmZpL8cTQ5MoY6t
OUL72psqkDmRC2Z2GzuncihhFuI1kw7tk/FdmnETLQRoBtN4JimaRoFQqxbe27B0
vO2bIeBPeLDLdhBxlXa0LI3IGnpsexen0F+EDPB6GXS9J8v/caYwtylMfasiEus0
v6MWl9RY7E+ode+ECXlU06TDXzaVi+UAFvcjQQIDAQABAoIBAAgpt9lTtCBYD/qd
daU9KbzLn8Q0kfA8qgcUl9JelduAcqO7y3559W42TXOQcAR4pjM2KVISi7BDf/bO
PjYVviQheuGH6kOum6gB229IEi6FB+Rsu8NFaI8Hq0EFk5nj7pQMTIbO9E6tDZA7
PRyIjvsf29U9G2XEt6WYtRFFrDn3PMYwmxL23b0StUd7Y2RMcXUceRUe7DLmdENj
4Vm0cpkkZTVu5l/mmglKlkCzoKlpC1GVZd3pJY103PnWtz8ag3Ih8j3WG14FYAcC
iaBPBV6tUo+7rI261/5PsYoLQNjDFpcQOMvQlOgXeck8dhckoGLxm8k7fuYOp5vK
0CWpoAECgYEA/1d2QU+eaKkvWOkqQEa9lvPWLeuoZHCRo3x5HP6J0dbsrmJ3DR1w
t1kIvMXns87IF+KroS0q+edNYnnSWH2lfrNGAQyeZGLEcc1PIlCvAgQmH8FehF5y
r0fC5qj6Le2XDjWkFZ4AHJpBDfvaZRW1mXibkmgT844EDQcIMqQPxIECgYEA8GkI
jmLSgfzuPt6iqjEdQL1g3NP0Eu5M/qgRT+Km91QZS3OtKXqLCVVgQfzFD1+cm0wD
ZdQIdRjKad/O1XGeLXHsRIiorqHwQ9fUnJSdJxMnJ9lhHlkyGfxBK1VZ0VYjhyre
Qlq8tjZyJRsdjyd1hhjXerjCBeoIsGZKn0Qc/sECgYEAn2Iswp+8NYBFua3xXaXK
egtCSe+rcOaDQhVUVDDePkl1+3Qi8+DIlunQdmTiOG5+n8oxb64OAWfL+ggosGvd
fbTRoZ4K0IaGMLMDDlxmoU+NrIy7PszlsVuN4QThBQIlJA1/mq7BSxlOOjhXHnnq
nR2Xnk+xBHpFNQyKpXGbFgECgYAxQ/Ti6NFmneRcsdb3tXTfLW/KEQ01S+wvS1Ww
3yuEB5HfamcT1u7jDMHbA+eGDPvUvzD7DwZkqJ3iMGD8UHovqebW7IJUtw67eGEz
bSj/NueRPPSv+WtQ8+aO8MClK1fAfUJqqpl9ZY7il7no+hcVUcXmejIYcCszquKj
3JtsgQKBgQDGFE3KsR+fw6sMe/Nf2Vu+d8Y2uizdYEUijh2qFIkKP9hSkl4+30/2
QFicIor53aFa3os+ZSvRT5zyY+uxwCfsds9qIjW1cr+xdkZxLhccOMnljuMHzXRG
deQxh2yHQ9pzPUr4cJTCdq0Q/jtEGp5b3vPvXv63/nzNZpdnWBasGQ==
-----END RSA PRIVATE KEY-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF1zCCA7+gAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgYAxCzAJBgNVBAYTAlVT
MRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQx
EjAQBgNVBAMMCXB1bHNhci1jaTAeFw0yMDAzMjkyMTAzMTBaFw0yMjEyMjQyMTAz
MTBaMHExCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRUwEwYD
VQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGzAZBgNV
BAMMEnB1bHNhci1jaS1yZWNvdmVyeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAK41jOTmc/XtTjIQmEvE/sHYfuUN/nbUNYerun3CpMOlUsenkMn8k1ms
NCydtqvOLCK4OMjyIg/zany/1w1L2WwV4/Rg3cqCx+0n/WjfwaiP5oJ55d2G9tgN
jrAy1ir8AaWgTJhGs8ktTtsPSIGZjbR0pMavXoWCdqbRba6Nt04/5Q+CyUo1gXu5
c0oImC4DcJFkWW26iGF35BuVUGPmYtLOW2Zr6Wg2lcL4nZ8C2FpBGLYMtXvPVY5S
dJlaA7MVjCrVaxCB+LdS+1HLywvhY8Zuodm5Q1QOhnmFti8BHBkwAOynjd5DqP8q
qmjNZ3yC80bSlGeJ6GV1i5Cxkeyw1HMCAwEAAaOCAWcwggFjMAkGA1UdEwQCMAAw
EQYJYIZIAYb4QgEBBAQDAgXgMDMGCWCGSAGG+EIBDQQmFiRPcGVuU1NMIEdlbmVy
YXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFPZsppie+Vgxp01iUTRt
Ik2DPw74MIG1BgNVHSMEga0wgaqAFAXVbjo175vQXn9g0za3eFVTNKi1oYGGpIGD
MIGAMQswCQYDVQQGEwJVUzEWMBQGA1UECAwNU2FuIEZyYW5jaXNjbzEWMBQGA1UE
BwwNU2FuIEZyYW5jaXNjbzEVMBMGA1UECgwMU3RyZWFtTmF0aXZlMRYwFAYDVQQL
DA1JVCBEZXBhcnRtZW50MRIwEAYDVQQDDAlwdWxzYXItY2mCCQC1PNkXuuj77TAO
BgNVHQ8BAf8EBAMCBeAwJwYDVR0lBCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMCBggr
BgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAgEASqs3WwDz3eSsu3kywp/WI+UHjVLv
8EmMgnzgMqHmbizQyqRAO5T0X/p8CaKDFr26au+mVylmQs/wtgzMdiDouBDMsF7O
rSSZ/p/Gbd+aPPi92rxglG8eJXtMtMJQU07+7AX+Xb7e22/z//AN0ovT6lw+yelY
n/4FR8AKuqhQRT6/+etq6Mex5MsalMXvT9qrL9oL8mGpz3LKdreGBbg40YhFgMRF
edi6OBWF328MHEp1NaDJDKWXdIunWtt0t2Fa4EGZEdA3N11DljuRzq9iYLYO8cJl
rYbo6afL+Yqh/GWTgdlCreEzaClv6lVP5jAduWpSPICTpY0UmS4JHHV2yY9qieCo
+dEWHv9yyHHOqLIu8/q7NPljz+1NzRg7y4KUCQ5BZix0WKa0R98hAyY+LeCkFNgQ
elPQDvhvyzVMpGUITSoN5/CQNx8Ei3r2Jfv7S5Q7k5oBudYQwKTHnCtmAM2kAo5Y
Lr21dRXAS2DJ6sAzovhaJA5GB1ukO7jVLQiFxG6vNj4gC25XuT1+vTZh7buz1VYj
cIaIrP1xKCklKVQTWtoH1ZA4X2UMw6L5JpLKIdtxgWU4/bg7ql6NcWHAwvf0T/xv
TFYsccuxha3X/boFWSTdnGoX3dg7YKwrwRS9tUFGLlvTK0bwhTRdpe5A77XlBjwO
PwECqK8ty7Ut+vU=
-----END CERTIFICATE-----

View File

@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICzzCCAbcCAQAwgYkxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNp
c2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRp
dmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGzAZBgNVBAMMEnB1bHNhci1jaS1y
ZWNvdmVyeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK41jOTmc/Xt
TjIQmEvE/sHYfuUN/nbUNYerun3CpMOlUsenkMn8k1msNCydtqvOLCK4OMjyIg/z
any/1w1L2WwV4/Rg3cqCx+0n/WjfwaiP5oJ55d2G9tgNjrAy1ir8AaWgTJhGs8kt
TtsPSIGZjbR0pMavXoWCdqbRba6Nt04/5Q+CyUo1gXu5c0oImC4DcJFkWW26iGF3
5BuVUGPmYtLOW2Zr6Wg2lcL4nZ8C2FpBGLYMtXvPVY5SdJlaA7MVjCrVaxCB+LdS
+1HLywvhY8Zuodm5Q1QOhnmFti8BHBkwAOynjd5DqP8qqmjNZ3yC80bSlGeJ6GV1
i5Cxkeyw1HMCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQBVYfA4nqzuKnGppwmG
NTgAeVGJTD+i/eVHi4Vn8gAKNmYrnZzD9H0JUDlqhFcPShneT65AFhkd2lm2Sdg6
IqNDnnMcATU9MkMkj9fO+a5IBwvRgbvq0KZOaPUQDIB4g31vy0ldqS8HwU80Q5bz
pVSFeLoWzSJ1aNEQ2L7yz/tICFQ16Jpy8mzcYk3IXWdlcu3cqY5XqFazhLeacgVp
x9W1frO3odqP174qo/XbvClSShjWQthDNUE1uh3J/RfoDFLzNpBXRYR8QPVImp3b
gdzOccNuFGJm5a9PoX/6lD7pNQxEUAWaLkXZ5n6MybiANhRks71E8pNfXmORDekb
t5a9
-----END CERTIFICATE REQUEST-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCuNYzk5nP17U4y
EJhLxP7B2H7lDf521DWHq7p9wqTDpVLHp5DJ/JNZrDQsnbarziwiuDjI8iIP82p8
v9cNS9lsFeP0YN3KgsftJ/1o38Goj+aCeeXdhvbYDY6wMtYq/AGloEyYRrPJLU7b
D0iBmY20dKTGr16Fgnam0W2ujbdOP+UPgslKNYF7uXNKCJguA3CRZFltuohhd+Qb
lVBj5mLSzltma+loNpXC+J2fAthaQRi2DLV7z1WOUnSZWgOzFYwq1WsQgfi3UvtR
y8sL4WPGbqHZuUNUDoZ5hbYvARwZMADsp43eQ6j/KqpozWd8gvNG0pRniehldYuQ
sZHssNRzAgMBAAECggEAPfkK4DsjMW90C9dfdkTkI+1yZuWtinQ/fr4Wn7pohrj/
U8tGdLSHbrUV8nFAlKnJhahnewS4HViIn0xXooFDHXJEH6F+BRa1LKa3PWGsMNzQ
McZPgZkLoxxfkErlaXEw3MzDssAkIQMfNEqhjokjofiEzbGBPJmGwB1smVYMyabX
AwA8PrtH0c5Wk3DiZcJrQY5C1jVpfh0HA8jXdzoleYbWpjGz8zfZYHhV9Enufw4W
2Uun4+LUxBvOAtrEvjcsHUF0C9tfUk97CT/KlqvndLjsJI1D2iRRZYqZBp1Cj8Ud
EirSj8zx5eR56uluZV5QmXQbJsbO7dMXQknfiwCRQQKBgQDTnV8W1JHssmgCqJUc
1W/OQJMk8Ty1If5WwIbqx2D56fcTcat48O4AIZB1H/Jc58GEgTTqsTYR6VVn1IOw
soQHnzfKZpUYU6HOiLdsdVM8y9g+k6nHFbEfvXvOyyHVOv1mGVjTQevwQrj/oA1D
EivycmyHxes03NdzhbNm35zF0QKBgQDSv7EzUP2/SoNlrK3bJ66zbHMTXSZ9RpAB
hU+V5yvHbvnCDFWCZeSAXmKIEGHF/oP+gTIru4aGOFdDuuyY3xnIT/8IU9gngLc+
TWhk7gVPwO9/CcitrziIpNkOZs/TRo9nKLF61DeNT1ZfIpQS8pQTyNyAKKMNheqH
SFFQh2wTAwKBgQCs/lHmEBDbN13gDoEX+URVkGS6JpxCV2/c67df525X3/SkaKCN
Vii64rV9iohPewawlA/2bLiPG/k90HV31fgpYvfw9rucD4KPnSSV/bP2V46IWZ7J
qeoK0JSOEXGvJ3JQLRh4W8PNvj4Oe4Fb+1cB9JjUxe/qXz+iqQJobxVygQKBgQCI
7b2fXu8PW8WVySVIsDbFIyB9o1c/rBoistAr0IBUWtlx5/ui9rsJYMnaJ/Ku5xgx
wxWq7nOQP4kLW6cgCEzDJp7IdVmLCQmGNFswwKm40N2LB/tYRfGQbrMMtWYwmrbP
ytPNv5a8fKDcvSXCTdRCKo6BwmV2gt0HusgCb4qbqwKBgQCCclGA+tGomV1AqOI5
wU3LAvWXIt7wbi3pOOhKEQYNM09+0nFXJc+13DY0g/luM2VkOBpac5T5F6F7ZDiP
vMBraJBKG1VqaGI/7Jpn8cSgTCHExJwk5rdmxJkWSmJCXVaW1oVT3PiSvEj9t/Ko
rgeGK5Elmg225nH43gJ0vk1I+w==
-----END PRIVATE KEY-----

View File

@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArjWM5OZz9e1OMhCYS8T+wdh+5Q3+dtQ1h6u6fcKkw6VSx6eQ
yfyTWaw0LJ22q84sIrg4yPIiD/NqfL/XDUvZbBXj9GDdyoLH7Sf9aN/BqI/mgnnl
3Yb22A2OsDLWKvwBpaBMmEazyS1O2w9IgZmNtHSkxq9ehYJ2ptFtro23Tj/lD4LJ
SjWBe7lzSgiYLgNwkWRZbbqIYXfkG5VQY+Zi0s5bZmvpaDaVwvidnwLYWkEYtgy1
e89VjlJ0mVoDsxWMKtVrEIH4t1L7UcvLC+Fjxm6h2blDVA6GeYW2LwEcGTAA7KeN
3kOo/yqqaM1nfILzRtKUZ4noZXWLkLGR7LDUcwIDAQABAoIBAD35CuA7IzFvdAvX
X3ZE5CPtcmblrYp0P36+Fp+6aIa4/1PLRnS0h261FfJxQJSpyYWoZ3sEuB1YiJ9M
V6KBQx1yRB+hfgUWtSymtz1hrDDc0DHGT4GZC6McX5BK5WlxMNzMw7LAJCEDHzRK
oY6JI6H4hM2xgTyZhsAdbJlWDMmm1wMAPD67R9HOVpNw4mXCa0GOQtY1aX4dBwPI
13c6JXmG1qYxs/M32WB4VfRJ7n8OFtlLp+Pi1MQbzgLaxL43LB1BdAvbX1JPewk/
ypar53S47CSNQ9okUWWKmQadQo/FHRIq0o/M8eXkeerpbmVeUJl0GybGzu3TF0JJ
34sAkUECgYEA051fFtSR7LJoAqiVHNVvzkCTJPE8tSH+VsCG6sdg+en3E3GrePDu
ACGQdR/yXOfBhIE06rE2EelVZ9SDsLKEB583ymaVGFOhzoi3bHVTPMvYPpOpxxWx
H717zssh1Tr9ZhlY00Hr8EK4/6ANQxIr8nJsh8XrNNzXc4WzZt+cxdECgYEA0r+x
M1D9v0qDZayt2yeus2xzE10mfUaQAYVPlecrx275wgxVgmXkgF5iiBBhxf6D/oEy
K7uGhjhXQ7rsmN8ZyE//CFPYJ4C3Pk1oZO4FT8DvfwnIra84iKTZDmbP00aPZyix
etQ3jU9WXyKUEvKUE8jcgCijDYXqh0hRUIdsEwMCgYEArP5R5hAQ2zdd4A6BF/lE
VZBkuiacQldv3Ou3X+duV9/0pGigjVYouuK1fYqIT3sGsJQP9my4jxv5PdB1d9X4
KWL38Pa7nA+Cj50klf2z9leOiFmeyanqCtCUjhFxrydyUC0YeFvDzb4+DnuBW/tX
AfSY1MXv6l8/oqkCaG8VcoECgYEAiO29n17vD1vFlcklSLA2xSMgfaNXP6waIrLQ
K9CAVFrZcef7ova7CWDJ2ifyrucYMcMVqu5zkD+JC1unIAhMwyaeyHVZiwkJhjRb
MMCpuNDdiwf7WEXxkG6zDLVmMJq2z8rTzb+WvHyg3L0lwk3UQiqOgcJldoLdB7rI
Am+Km6sCgYEAgnJRgPrRqJldQKjiOcFNywL1lyLe8G4t6TjoShEGDTNPftJxVyXP
tdw2NIP5bjNlZDgaWnOU+Rehe2Q4j7zAa2iQShtVamhiP+yaZ/HEoEwhxMScJOa3
ZsSZFkpiQl1WltaFU9z4krxI/bfyqK4HhiuRJZoNtuZx+N4CdL5NSPs=
-----END RSA PRIVATE KEY-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF1jCCA76gAwIBAgICEAUwDQYJKoZIhvcNAQELBQAwgYAxCzAJBgNVBAYTAlVT
MRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQx
EjAQBgNVBAMMCXB1bHNhci1jaTAeFw0yMDAzMjkyMTAzMTBaFw0yMjEyMjQyMTAz
MTBaMHAxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRUwEwYD
VQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGjAYBgNV
BAMMEXB1bHNhci1jaS10b29sc2V0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA1Oy51AEmFFblTOIzl+IWZftQ9+Htg66v/8kUNR7h+AYRor9Vyf3AuBMV
ZuwHjl0xz0Mk3wir2RIhbcuXdiagcgdsijOWrSJK3uGgkKO0LWZMkMWcMNTgxm3S
+2NhHxdZWqNsX0Fgfju5F5IA7yOoBsTcqTt/xKyBocFshd8D0VvwrPkdoqVWoBKf
mIkJg+qp77DQ0rzvpkqGVjjIaUmFPyQL9Rv/escxZHwj7Q3JoGzY7KwgPGAwwwip
CuhCi9+yyjhGCP0j0amLuEJAsTwYp7fguuZnyQFsJQ29MbesWtxoyt68wk7QPLCg
/ZBLljdJSA7hNwjO8IZ97DzwmFfn0QIDAQABo4IBZzCCAWMwCQYDVR0TBAIwADAR
BglghkgBhvhCAQEEBAMCBeAwMwYJYIZIAYb4QgENBCYWJE9wZW5TU0wgR2VuZXJh
dGVkIFNlcnZlciBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUsgXRoPfGg+Upnv87zdHm
3L8RWBMwgbUGA1UdIwSBrTCBqoAUBdVuOjXvm9Bef2DTNrd4VVM0qLWhgYakgYMw
gYAxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQH
DA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsM
DUlUIERlcGFydG1lbnQxEjAQBgNVBAMMCXB1bHNhci1jaYIJALU82Re66PvtMA4G
A1UdDwEB/wQEAwIF4DAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsG
AQUFBwMEMA0GCSqGSIb3DQEBCwUAA4ICAQBCSA8FMpjtni9++dsKS4g6/iA+6tIP
ptKZa5Cvo3UYImSBPwaySozN0/yDfHCuftieWWdWLUjXnu6ms1DQI5hLCqKEt2AE
F5XCj8WVpkTaGtdBgyz2ftQDdJEbP/g8orANq6ET3BHAKkmok4v9xDol0KUejR4b
QwUoHKPIg6NbR8VH6JDxX3VINTWnyRKKSDsT11ZrjlZQeVv0T/vt+CGy7u0VXP/V
UzzuL5mZaKcBAq7JmuZY6xH2Q4dlrORt3KZM21T25laNOKfTE/vZfaO76S9WYlKZ
bJLWEPEUhhM+vofwPw/nOOJmp0iu+bKt5VLrNcAZ0fCnJld4sBHcPOZQ7B7wScf4
pWcKEzTzScn4MfEj9FZCJSV4ph8QWA3n8Ue9EVXkIWCevNjtnoPTzp7Qx8H+kr0j
53JqPbjoENfqaDxKVEqPCEBPljgYAQ/uocuoMOKCSLlD27bGFnwwg+nyoA9j6fXS
TXLZ4tYlA2qiGyDMJPc47ovEugXWUfDabu/ScuUItdnhZajdw9zRjD44+oSb5UfC
Yb84WFtDswjO/qayfI/nt72tYymtQjOl3W9RtNMJNZf6c1LeumHaB56lpCnoLKYh
Ap6rtWTCup/GtCXynXje76rMwsv1OLuo/1tm3wUAlYIoQPuoVjtlXG6P1XtZRErd
OfCFrGQHLuH9Vg==
-----END CERTIFICATE-----

View File

@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICzjCCAbYCAQAwgYgxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNp
c2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRp
dmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxGjAYBgNVBAMMEXB1bHNhci1jaS10
b29sc2V0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Oy51AEmFFbl
TOIzl+IWZftQ9+Htg66v/8kUNR7h+AYRor9Vyf3AuBMVZuwHjl0xz0Mk3wir2RIh
bcuXdiagcgdsijOWrSJK3uGgkKO0LWZMkMWcMNTgxm3S+2NhHxdZWqNsX0Fgfju5
F5IA7yOoBsTcqTt/xKyBocFshd8D0VvwrPkdoqVWoBKfmIkJg+qp77DQ0rzvpkqG
VjjIaUmFPyQL9Rv/escxZHwj7Q3JoGzY7KwgPGAwwwipCuhCi9+yyjhGCP0j0amL
uEJAsTwYp7fguuZnyQFsJQ29MbesWtxoyt68wk7QPLCg/ZBLljdJSA7hNwjO8IZ9
7DzwmFfn0QIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAF1xlJi80nwY6WduRUVA
fo6EbDdoh+O124f81I+4yg1zrf623+qVlIJyDO+phhxwf1XxioQkTiimryRbvDPf
y2ST1zF1bFrFqFgvUMggGgeUG2cwSF98egaUOHlhWjXPTiBs20gf2W9aueIsn/TK
uiEdONzbprBtXRX76/0e0jP3YXc48YjTYlgcAgJI4JRR3qccDt/mapSuPBSvkq6C
5FKN5ou6TuDW08N3wFv40D+YGwvwSBWgnr5NlQFVsrr53ijwJ7mRfg8kBK3SdlG5
uu/03JjML7eNdphH1DNeljV7ZZXEnAyNcq4La5NM0Tndi9wgrQNOMKEpV1fzTZWV
kec=
-----END CERTIFICATE REQUEST-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDU7LnUASYUVuVM
4jOX4hZl+1D34e2Drq//yRQ1HuH4BhGiv1XJ/cC4ExVm7AeOXTHPQyTfCKvZEiFt
y5d2JqByB2yKM5atIkre4aCQo7QtZkyQxZww1ODGbdL7Y2EfF1lao2xfQWB+O7kX
kgDvI6gGxNypO3/ErIGhwWyF3wPRW/Cs+R2ipVagEp+YiQmD6qnvsNDSvO+mSoZW
OMhpSYU/JAv1G/96xzFkfCPtDcmgbNjsrCA8YDDDCKkK6EKL37LKOEYI/SPRqYu4
QkCxPBint+C65mfJAWwlDb0xt6xa3GjK3rzCTtA8sKD9kEuWN0lIDuE3CM7whn3s
PPCYV+fRAgMBAAECggEBAMefpV1JMm1RRqt9S4ezNPKp2zB7hdW2elViLOrcqFiD
QBeIMSMuH3e0lJUo5rCnWSKLPc9I7uyVnfe1L6xa7IPbx/wN/88UXoN1n7bbc/o4
dcIpMpVpj88ZefusIYsnteNPYjQwNApFbfPWM8AAevDVsleLa+91GBgSIu+jtY2a
YlPazfRil2pgzNNit5LLHZtSdHB8aznSsNm1B55uOXlHW8U3zUT8rU0/SVVBbL9u
JPrrnc/95qZ/f/6PMVgWA2SHa7mS8qbpFGWl5pc7B3pF0AgTYA1Su885oZ+v3+8U
vbWMbI87Ruseu/NHQ4LiSMdQN242wQIfob0eCSdaicECgYEA6eHPlQbAbYEsNZp/
+qcSE7LZV1FIW6eqIe/eUlBbMRZ7wSXXFutlh3Kbn+XxwpIV3bDhjxYuNKS0LudA
/aB+pfMmZ48k6CN/krbsvVtqJ3FMmiI/RGo0yt7F8Lp6ghVaw4yIKB2bcM68MpVe
xG4HKrDbs5ojyZI2mMqNh8lB/dkCgYEA6Q+LvOsJvSO/uTEdLIWH4Gtyj0nHjv9/
Z0s53I6gOYD8s01ZH0EObvGg9UUdpOYfENP8S3qvGd6ZYUk77uXBzlHwiDjLh1TW
CssAiorsWbofuEhq6EDtO2Rl4qafPbdxonep/RXlVQuHGUxxpYNiZcnwanQ1VTG2
K3d5Poe7ZrkCgYEA6M7SJvH1kgtGyoTkZ8jugZVCK1zJvhKDlAyFLUK3w4Ex5u2X
0US4Z795kgz+PkPUaDyuChR2IgjhIt8nHlAoQWBsFiGzBzBuyMg1l7frTx/EtJjq
iVt++YIPXrUBRYOkOYsl7WirVfsz8tYk4zry/1fVGk6Q2REmL6lQgJ2hhuECgYEA
k9c1uHiMa/vScgKy0/w8rmLagAS4X4C56+dvY/bhsridFIybXVUid8Q1a4EVhfYo
fL9MiwDfNJTdTTZsm2YJ4/xcjb0hds6dHKmbxUbNGToVRwxBLOWK16MfcoBqAXdt
0TcBkTcjjChM4gJ5ERpf/9vy80SWVF29hqM6OS1W9pkCgYEArRK6fyeQBX2UtW39
6OKH5Er1esLQ8tk7BH+t74OH2nrqKC5wu+oBG35rCDhq1ocP7QH+bnnpKZs0Xeoo
im1zPzD0v8/BeGz7Uiv7ZyzNBki1YFEW5yagnYc+rjGRfEAbsARpDHtxniU4PjBu
WXwvaO7oaX+DB8M4pZn4zyPmdGI=
-----END PRIVATE KEY-----

View File

@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA1Oy51AEmFFblTOIzl+IWZftQ9+Htg66v/8kUNR7h+AYRor9V
yf3AuBMVZuwHjl0xz0Mk3wir2RIhbcuXdiagcgdsijOWrSJK3uGgkKO0LWZMkMWc
MNTgxm3S+2NhHxdZWqNsX0Fgfju5F5IA7yOoBsTcqTt/xKyBocFshd8D0VvwrPkd
oqVWoBKfmIkJg+qp77DQ0rzvpkqGVjjIaUmFPyQL9Rv/escxZHwj7Q3JoGzY7Kwg
PGAwwwipCuhCi9+yyjhGCP0j0amLuEJAsTwYp7fguuZnyQFsJQ29MbesWtxoyt68
wk7QPLCg/ZBLljdJSA7hNwjO8IZ97DzwmFfn0QIDAQABAoIBAQDHn6VdSTJtUUar
fUuHszTyqdswe4XVtnpVYizq3KhYg0AXiDEjLh93tJSVKOawp1kiiz3PSO7slZ33
tS+sWuyD28f8Df/PFF6DdZ+223P6OHXCKTKVaY/PGXn7rCGLJ7XjT2I0MDQKRW3z
1jPAAHrw1bJXi2vvdRgYEiLvo7WNmmJT2s30YpdqYMzTYreSyx2bUnRwfGs50rDZ
tQeebjl5R1vFN81E/K1NP0lVQWy/biT6653P/eamf3/+jzFYFgNkh2u5kvKm6RRl
peaXOwd6RdAIE2ANUrvPOaGfr9/vFL21jGyPO0brHrvzR0OC4kjHUDduNsECH6G9
HgknWonBAoGBAOnhz5UGwG2BLDWaf/qnEhOy2VdRSFunqiHv3lJQWzEWe8El1xbr
ZYdym5/l8cKSFd2w4Y8WLjSktC7nQP2gfqXzJmePJOgjf5K27L1baidxTJoiP0Rq
NMrexfC6eoIVWsOMiCgdm3DOvDKVXsRuByqw27OaI8mSNpjKjYfJQf3ZAoGBAOkP
i7zrCb0jv7kxHSyFh+Brco9Jx47/f2dLOdyOoDmA/LNNWR9BDm7xoPVFHaTmHxDT
/Et6rxnemWFJO+7lwc5R8Ig4y4dU1grLAIqK7Fm6H7hIauhA7TtkZeKmnz23caJ3
qf0V5VULhxlMcaWDYmXJ8Gp0NVUxtit3eT6Hu2a5AoGBAOjO0ibx9ZILRsqE5GfI
7oGVQitcyb4Sg5QMhS1Ct8OBMebtl9FEuGe/eZIM/j5D1Gg8rgoUdiII4SLfJx5Q
KEFgbBYhswcwbsjINZe3608fxLSY6olbfvmCD161AUWDpDmLJe1oq1X7M/LWJOM6
8v9X1RpOkNkRJi+pUICdoYbhAoGBAJPXNbh4jGv70nICstP8PK5i2oAEuF+Auevn
b2P24bK4nRSMm11VInfENWuBFYX2KHy/TIsA3zSU3U02bJtmCeP8XI29IXbOnRyp
m8VGzRk6FUcMQSzlitejH3KAagF3bdE3AZE3I4woTOICeREaX//b8vNEllRdvYaj
OjktVvaZAoGBAK0Sun8nkAV9lLVt/ejih+RK9XrC0PLZOwR/re+Dh9p66igucLvq
ARt+awg4ataHD+0B/m556SmbNF3qKIptcz8w9L/PwXhs+1Ir+2cszQZItWBRFucm
oJ2HPq4xkXxAG7AEaQx7cZ4lOD4wbll8L2ju6Gl/gwfDOKWZ+M8j5nRi
-----END RSA PRIVATE KEY-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF2DCCA8CgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgYAxCzAJBgNVBAYTAlVT
MRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2Nv
MRUwEwYDVQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQx
EjAQBgNVBAMMCXB1bHNhci1jaTAeFw0yMDAzMjkyMTAzMDlaFw0yMjEyMjQyMTAz
MDlaMHIxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNpc2NvMRUwEwYD
VQQKDAxTdHJlYW1OYXRpdmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxHDAaBgNV
BAMME3B1bHNhci1jaS16b29rZWVwZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCqITWDFOGDR8zuiPrlu5+LsX0ToYfwAJFl10rW3G1vEsDoIc6ckNZ3
EMXQlIcG4qKv46aBDz7j+fYLFxe2nB4O5K3vNnAwJKlpbsj/T4EKyPMavzo6YtrZ
jtPH0a7NxfSXtoTl6HoxPL0xzE9GdaD8/zloEDmcakfQdMHT2RI/7ZCC23QiNdtJ
4qZFjf7mTjoe/qaG3zdYsI180nR+uH6h8P5mzIQML0ME7lM0MzoyoAsOeykS40dB
yFDcbOp/Z878Zx++2Cb39KibQ4BGbicXJUjWaJ6l9EFp5RektjluyOioJyRH/u2w
VfKWJODvug/sZsgobCNv64N0rJOvZESzAgMBAAGjggFnMIIBYzAJBgNVHRMEAjAA
MBEGCWCGSAGG+EIBAQQEAwIF4DAzBglghkgBhvhCAQ0EJhYkT3BlblNTTCBHZW5l
cmF0ZWQgU2VydmVyIENlcnRpZmljYXRlMB0GA1UdDgQWBBQVX4oxgqLxXeerh43g
+IuOyenZcTCBtQYDVR0jBIGtMIGqgBQF1W46Ne+b0F5/YNM2t3hVUzSotaGBhqSB
gzCBgDELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDVNhbiBGcmFuY2lzY28xFjAUBgNV
BAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAoMDFN0cmVhbU5hdGl2ZTEWMBQGA1UE
CwwNSVQgRGVwYXJ0bWVudDESMBAGA1UEAwwJcHVsc2FyLWNpggkAtTzZF7ro++0w
DgYDVR0PAQH/BAQDAgXgMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDAgYI
KwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggIBAIVogKtIA2arT/sMmm57i04CdrO9
ttv2mgRb47lwshtfbHFv+oCJuXSubFTxMUPpEeecrxfiBt30xbLEx9CwBOZpewDl
btERhG6B8WCVvYRIUb9uQdfgqAY6kD1ThapDWuDQRMw7h1Bc0c3PBiMrjCCFPsO+
Vp4kv1BvzatWGkKOgMmUjRbIjHGta7qN4jqlOyzyMlbLbGCXutTOdpc+hjYUtYZg
zAGZmkPFFYyDG2cPGLXI+io7Q6ZWAZD3AYhgYJTrMOvKs2+iUSZ5kRyPKyUd4tsJ
Pl07Zz5yY78psWYV+by1b09Ehv0IoTYC5kEwnSjYB/lYhPm7E2E1XDaYHzIPXiQ5
2kyH20zI9n55cEYWfo96h0dU/Uk5StbGxC8AZQQ64mmd0afqejTqQ5fOGI+04aoo
X9mjQB5G5OTSHNdxm2t1HOaJYMTkdMmmjeCW0Dy1jtERe7+KsBclXRChwmXs48Kd
Y/DyxAx2ssLtYrKF4vqY3uuPcGmEePgRUAZ5HY+PqrP/lxjhibzTlbaVDMG1/1jG
yUjPoFa95ZqcIP9F1QLRCjNXUmHzFTOh4YoI9AFO9WdcexeOgFiBINptNyShNCJt
NGDsMjdeevRCSjEClrClYG6ZVzp0NXDt3Yk8XcTqwmxz/n7kOAGoThWiwzisOV+L
wcJC6h29x0XWiTfE
-----END CERTIFICATE-----

View File

@ -1,18 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIC0DCCAbgCAQAwgYoxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1TYW4gRnJhbmNp
c2NvMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKDAxTdHJlYW1OYXRp
dmUxFjAUBgNVBAsMDUlUIERlcGFydG1lbnQxHDAaBgNVBAMME3B1bHNhci1jaS16
b29rZWVwZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqITWDFOGD
R8zuiPrlu5+LsX0ToYfwAJFl10rW3G1vEsDoIc6ckNZ3EMXQlIcG4qKv46aBDz7j
+fYLFxe2nB4O5K3vNnAwJKlpbsj/T4EKyPMavzo6YtrZjtPH0a7NxfSXtoTl6Hox
PL0xzE9GdaD8/zloEDmcakfQdMHT2RI/7ZCC23QiNdtJ4qZFjf7mTjoe/qaG3zdY
sI180nR+uH6h8P5mzIQML0ME7lM0MzoyoAsOeykS40dByFDcbOp/Z878Zx++2Cb3
9KibQ4BGbicXJUjWaJ6l9EFp5RektjluyOioJyRH/u2wVfKWJODvug/sZsgobCNv
64N0rJOvZESzAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEARBLSgRuoJniQqmqi
cCLEab3HjNB0guiL6MmdmGv6D5BwH0MnEyE8RvdRiA+lcQGXC3ySpnmVc5nz99m3
H8dQGC+6QjiRFWzsZ4nsvDG4gubASfSG8ruewNnafLyWCwnHS1M7KHoj9QjhgOIv
qf4Ud2px0RNZY5LSl0e9rYp+LehokD6oZJCoU4uiEjli9vPR61oa3+/oFlzfDsN/
O4ojDkNFpL/zpbpOYTrGcgtMghGrDjzG7jZ5LEzAFmcjmCaDNK16b5Y2Zat+IiaA
cH3KdED8SohBEXRzbhBnEle5YwdS3bDYzyDnXYlvCEI9AWxolmKzQvrAWkah1X2t
6rz3xg==
-----END CERTIFICATE REQUEST-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqITWDFOGDR8zu
iPrlu5+LsX0ToYfwAJFl10rW3G1vEsDoIc6ckNZ3EMXQlIcG4qKv46aBDz7j+fYL
Fxe2nB4O5K3vNnAwJKlpbsj/T4EKyPMavzo6YtrZjtPH0a7NxfSXtoTl6HoxPL0x
zE9GdaD8/zloEDmcakfQdMHT2RI/7ZCC23QiNdtJ4qZFjf7mTjoe/qaG3zdYsI18
0nR+uH6h8P5mzIQML0ME7lM0MzoyoAsOeykS40dByFDcbOp/Z878Zx++2Cb39Kib
Q4BGbicXJUjWaJ6l9EFp5RektjluyOioJyRH/u2wVfKWJODvug/sZsgobCNv64N0
rJOvZESzAgMBAAECggEAKPa+D8XjVtze90B8SPyYOeaOmz91n9BDMiZYmsuQfgIh
+MLLIN+vBBRBzSs2J+5CBd/mo4SsO/Bf0ePJjeqhQizFxKdy8+Sf9gb61p6qD5K7
FmGc/5n14BSH4cEXOezELBOChGkpotlhJLBxFiIUlVZO2EOv232rtQGn+f52anXA
jVa8JlcWjusb4D6586hV6zhyhk5qgHB3YxhA4461P/zpUqn6dWNrYV4m60vYWm4L
mwnTldn6bTfZxsdrZrgPOR9mCB/O02daLkDF2gJMNWtPFt3irR5nx/HxWls22LB5
rMD/LiLunELtAF6mXGYAeE57otK+XmdfqeKFv2M/YQKBgQDaxQLr/aUEmwxmyU3k
Ny+Z/1jDzjxfoNsbvU+2HxsEh0ahT5B3pQQNOjST21yzxYIrZ3P1AwTiuzuQffZk
PckFDTrCWQm6Fit+7Ku5aXqtJ4VhF6+QKTXJuFvQ3O3wsrJ7VZaMYZLcA0kzIIyw
NK7/7EaQO9HgMEyyQXJCBa5s5QKBgQDHFSMy22Exb0fDndKHy0+HV4v3HhzDGdZ8
RIuy9J1E6eV1j+FwzTa/nDzj252vZrflFfh+who4BcRAKgK4pJb4YMHTUI6GAhEa
Rsg/6CzOGxw7CAkLMaVnj+TiIKzx6RGmzBCP3hToF9ZpnkmgXFwIsfKZoXvPEp8s
Sdb5krjptwKBgQDJeY8LT3leGHz/XH1DpB9Or/9LtO+dEkM39M0oaNU1AnBltyTR
S0PD+srZMLjbRxZuasQ77R/ev5hHpfn4r34mDN0Eh4ORwUElj0lHZID6Xt9TX8Dr
/0fuEr9cR1tKxQfi1hvkBSh/Pvd3Ao8O6DYSs8L4ql7LHTBFKkjTzO+qkQKBgDgI
nQWddbfCSIKoky8hbFr9qyl80j+fsBz99gwCiZlx8+GpA50KRZSc1w6TK8jIso3K
J00WOOb3yIr+yBFMUinKogNmMxdI0aOBtK84HBRO0R1UX6dE6/dAKv3ykHruTMeT
vD2iFmRVAUZtBPAbztOrskrHht97sE144wcP4vf1AoGAEx6O56DDjIxd/b5rC4mK
n6AKzg/cJJLgN67ZUIZ87RQkuoRzvA8wiheUTbD/H75KfPmIPt085oDmjvKYLEZC
l5R8ceLAxlQnhOYPVp1NjMP8YCcukWLdN1ltjVl1Fs/aUC9AzpyzzpU2auMuPk8q
KCJQmTbCbDIGHfW39T6kNvE=
-----END PRIVATE KEY-----

View File

@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqiE1gxThg0fM7oj65bufi7F9E6GH8ACRZddK1txtbxLA6CHO
nJDWdxDF0JSHBuKir+OmgQ8+4/n2CxcXtpweDuSt7zZwMCSpaW7I/0+BCsjzGr86
OmLa2Y7Tx9GuzcX0l7aE5eh6MTy9McxPRnWg/P85aBA5nGpH0HTB09kSP+2Qgtt0
IjXbSeKmRY3+5k46Hv6mht83WLCNfNJ0frh+ofD+ZsyEDC9DBO5TNDM6MqALDnsp
EuNHQchQ3Gzqf2fO/Gcfvtgm9/Som0OARm4nFyVI1miepfRBaeUXpLY5bsjoqCck
R/7tsFXyliTg77oP7GbIKGwjb+uDdKyTr2REswIDAQABAoIBACj2vg/F41bc3vdA
fEj8mDnmjps/dZ/QQzImWJrLkH4CIfjCyyDfrwQUQc0rNifuQgXf5qOErDvwX9Hj
yY3qoUIsxcSncvPkn/YG+taeqg+SuxZhnP+Z9eAUh+HBFznsxCwTgoRpKaLZYSSw
cRYiFJVWTthDr9t9q7UBp/n+dmp1wI1WvCZXFo7rG+A+ufOoVes4coZOaoBwd2MY
QOOOtT/86VKp+nVja2FeJutL2FpuC5sJ05XZ+m032cbHa2a4DzkfZggfztNnWi5A
xdoCTDVrTxbd4q0eZ8fx8VpbNtiweazA/y4i7pxC7QBeplxmAHhOe6LSvl5nX6ni
hb9jP2ECgYEA2sUC6/2lBJsMZslN5Dcvmf9Yw848X6DbG71Pth8bBIdGoU+Qd6UE
DTo0k9tcs8WCK2dz9QME4rs7kH32ZD3JBQ06wlkJuhYrfuyruWl6rSeFYRevkCk1
ybhb0Nzt8LKye1WWjGGS3ANJMyCMsDSu/+xGkDvR4DBMskFyQgWubOUCgYEAxxUj
MtthMW9Hw53Sh8tPh1eL9x4cwxnWfESLsvSdROnldY/hcM02v5w849udr2a35RX4
fsIaOAXEQCoCuKSW+GDB01COhgIRGkbIP+gszhscOwgJCzGlZ4/k4iCs8ekRpswQ
j94U6BfWaZ5JoFxcCLHymaF7zxKfLEnW+ZK46bcCgYEAyXmPC095Xhh8/1x9Q6Qf
Tq//S7TvnRJDN/TNKGjVNQJwZbck0UtDw/rK2TC420cWbmrEO+0f3r+YR6X5+K9+
JgzdBIeDkcFBJY9JR2SA+l7fU1/A6/9H7hK/XEdbSsUH4tYb5AUofz73dwKPDug2
ErPC+Kpeyx0wRSpI08zvqpECgYA4CJ0FnXW3wkiCqJMvIWxa/aspfNI/n7Ac/fYM
AomZcfPhqQOdCkWUnNcOkyvIyLKNyidNFjjm98iK/sgRTFIpyqIDZjMXSNGjgbSv
OBwUTtEdVF+nROv3QCr98pB67kzHk7w9ohZkVQFGbQTwG87Tq7JKx4bfe7BNeOMH
D+L39QKBgBMejuegw4yMXf2+awuJip+gCs4P3CSS4Deu2VCGfO0UJLqEc7wPMIoX
lE2w/x++Snz5iD7dPOaA5o7ymCxGQpeUfHHiwMZUJ4TmD1adTYzD/GAnLpFi3TdZ
bY1ZdRbP2lAvQM6cs86VNmrjLj5PKigiUJk2wmwyBh31t/U+pDbx
-----END RSA PRIVATE KEY-----

View File

@ -17,14 +17,36 @@
# under the License.
#
monitoring:
prometheus: false
grafana: false
node_exporter: false
alert_manager: false
volumes:
local_storage: true
victoria-metrics-k8s-stack:
enabled: false
victoria-metrics-operator:
enabled: false
vmsingle:
enabled: false
vmagent:
enabled: false
vmalert:
enabled: false
alertmanager:
enabled: false
grafana:
enabled: false
prometheus-node-exporter:
enabled: false
kube-state-metrics:
enabled: false
kubelet:
enabled: false
kubeApiServer:
enabled: false
kubeControllerManager:
enabled: false
coreDns:
enabled: false
kubeEtcd:
enabled: false
kubeScheduler:
enabled: false
# disabled AntiAffinity
affinity:
@ -34,20 +56,37 @@ affinity:
components:
autorecovery: false
pulsar_manager: false
# enable functions by default in CI
functions: true
zookeeper:
replicaCount: 1
# Disable pod monitor since we're disabling CRD installation
podMonitor:
enabled: false
bookkeeper:
replicaCount: 3
# Disable pod monitor since we're disabling CRD installation
podMonitor:
enabled: false
configData:
diskUsageThreshold: "0.999"
diskUsageWarnThreshold: "0.999"
PULSAR_PREFIX_diskUsageThreshold: "0.999"
PULSAR_PREFIX_diskUsageWarnThreshold: "0.999"
# minimal memory use for bookkeeper
# https://bookkeeper.apache.org/docs/reference/config#db-ledger-storage-settings
dbStorage_writeCacheMaxSizeMb: "32"
dbStorage_readAheadCacheMaxSizeMb: "32"
dbStorage_rocksDB_writeBufferSizeMB: "8"
dbStorage_rocksDB_blockCacheSize: "8388608"
broker:
replicaCount: 1
# Disable pod monitor since we're disabling CRD installation
podMonitor:
enabled: false
configData:
## Enable `autoSkipNonRecoverableData` since bookkeeper is running
## without persistence
@ -60,8 +99,24 @@ broker:
PF_functionInstanceMinResources_ram: "268435456"
PF_functionInstanceMinResources_disk: "268435456"
autorecovery:
# Disable pod monitor since we're disabling CRD installation
podMonitor:
enabled: false
proxy:
replicaCount: 1
# Disable pod monitor since we're disabling CRD installation
podMonitor:
enabled: false
toolset:
useProxy: false
oxia:
coordinator:
podMonitor:
enabled: false
server:
podMonitor:
enabled: false

View File

@ -0,0 +1,3 @@
# chart-testing Action
This action is an identical fork of [helm/chart-testing-action@v3.7.1](https://github.com/helm/chart-testing-action).

View File

@ -0,0 +1,60 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Copyright The Helm Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "Helm Chart Testing"
description: "Install the Helm chart-testing tool"
author: "The Helm authors"
branding:
color: blue
icon: anchor
inputs:
version:
description: "The chart-testing version to install"
required: false
default: v3.12.0
yamllint_version:
description: "The yamllint version to install"
required: false
default: '1.35.1'
yamale_version:
description: "The yamale version to install"
required: false
default: '6.0.0'
runs:
using: composite
steps:
- run: |
cd $GITHUB_ACTION_PATH \
&& ./ct.sh \
--version ${{ inputs.version }} \
--yamllint-version ${{ inputs.yamllint_version }} \
--yamale-version ${{ inputs.yamale_version }}
shell: bash

168
.github/actions/chart-testing-action/ct.sh vendored Executable file
View File

@ -0,0 +1,168 @@
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Copyright The Helm Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit
set -o nounset
set -o pipefail
DEFAULT_CHART_TESTING_VERSION=v3.12.0
DEFAULT_YAMLLINT_VERSION=1.35.1
DEFAULT_YAMALE_VERSION=6.0.0
ARCH=$(uname -m)
case $ARCH in
x86) ARCH="386";;
x86_64) ARCH="amd64";;
i686) ARCH="386";;
i386) ARCH="386";;
arm64) ARCH="arm64";;
aarch64) ARCH="arm64";;
esac
OS=$(uname|tr '[:upper:]' '[:lower:]')
show_help() {
cat << EOF
Usage: $(basename "$0") <options>
-h, --help Display help
-v, --version The chart-testing version to use (default: $DEFAULT_CHART_TESTING_VERSION)"
EOF
}
main() {
local version="$DEFAULT_CHART_TESTING_VERSION"
local yamllint_version="$DEFAULT_YAMLLINT_VERSION"
local yamale_version="$DEFAULT_YAMALE_VERSION"
parse_command_line "$@"
install_chart_testing
}
parse_command_line() {
while :; do
case "${1:-}" in
-h|--help)
show_help
exit
;;
-v|--version)
if [[ -n "${2:-}" ]]; then
version="$2"
shift
else
echo "ERROR: '-v|--version' cannot be empty." >&2
show_help
exit 1
fi
;;
--yamllint-version)
if [[ -n "${2:-}" ]]; then
yamllint_version="$2"
shift
else
echo "ERROR: '--yamllint-version' cannot be empty." >&2
show_help
exit 1
fi
;;
--yamale-version)
if [[ -n "${2:-}" ]]; then
yamale_version="$2"
shift
else
echo "ERROR: '--yamale-version' cannot be empty." >&2
show_help
exit 1
fi
;;
*)
break
;;
esac
shift
done
}
install_chart_testing() {
if [[ ! -d "$RUNNER_TOOL_CACHE" ]]; then
echo "Cache directory '$RUNNER_TOOL_CACHE' does not exist" >&2
exit 1
fi
local cache_dir="$RUNNER_TOOL_CACHE/ct/$version/${ARCH}"
local venv_dir="$cache_dir/venv"
if [[ ! -d "$cache_dir" ]]; then
mkdir -p "$cache_dir"
echo "Installing chart-testing..."
curl -sSLo ct.tar.gz "https://github.com/helm/chart-testing/releases/download/$version/chart-testing_${version#v}_${OS}_${ARCH}.tar.gz"
tar -xzf ct.tar.gz -C "$cache_dir"
rm -f ct.tar.gz
# if uv (https://docs.astral.sh/uv/) is not installed, install it
if ! command -v uv &> /dev/null; then
echo 'Installing uv...'
curl -LsSf https://astral.sh/uv/install.sh | sh
fi
echo 'Creating virtual Python environment...'
uv venv "$venv_dir"
echo 'Activating virtual environment...'
# shellcheck disable=SC1090
source "$venv_dir/bin/activate"
echo 'Installing yamllint...'
uv pip install "yamllint==${yamllint_version}"
echo 'Installing Yamale...'
uv pip install "yamale==${yamale_version}"
fi
# https://github.com/helm/chart-testing-action/issues/62
echo 'Adding ct directory to PATH...'
echo "$cache_dir" >> "$GITHUB_PATH"
echo 'Setting CT_CONFIG_DIR...'
echo "CT_CONFIG_DIR=$cache_dir/etc" >> "$GITHUB_ENV"
echo 'Configuring environment variables for virtual environment for subsequent workflow steps...'
echo "VIRTUAL_ENV=$venv_dir" >> "$GITHUB_ENV"
echo "$venv_dir/bin" >> "$GITHUB_PATH"
"$cache_dir/ct" version
}
main "$@"

161
.github/actions/ssh-access/action.yml vendored Normal file
View File

@ -0,0 +1,161 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: ssh access
description: Sets up SSH access to build VM with upterm
inputs:
action:
description: |
Action to perform: options are "start" and "wait"
"start" will install, configure and start upterm.
"wait" will wait until a connection is established to upterm and will continue to wait until the session is closed.
required: false
default: 'start'
limit-access-to-actor:
description: 'If only the public SSH keys of the user triggering the workflow should be authorized'
required: false
default: 'false'
limit-access-to-users:
description: 'If only the public SSH keys of the listed GitHub users should be authorized. Comma separate list of GitHub user names.'
required: false
default: ''
secure-access:
description: |
Set to false for allowing public access when limit-access-to-actor and limit-access-to-users are unset.
required: false
default: 'true'
timeout:
description: 'When action=wait, the timeout in seconds to wait for the user to connect'
required: false
default: '300'
runs:
using: composite
steps:
- run: |
if [[ "${{ inputs.action }}" == "start" ]]; then
echo "::group::Installing upterm & tmux"
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
# install upterm
curl -sL https://github.com/owenthereal/upterm/releases/download/v0.7.6/upterm_linux_amd64.tar.gz | tar zxvf - -C /tmp upterm && sudo install /tmp/upterm /usr/local/bin/ && rm -rf /tmp/upterm
# install tmux if it's not present
if ! command -v tmux &>/dev/null; then
sudo apt-get -y install tmux
fi
elif [[ "$OSTYPE" == "darwin"* ]]; then
brew install owenthereal/upterm/upterm
# install tmux if it's not present
if ! command -v tmux &>/dev/null; then
brew install tmux
fi
else
echo "Unsupported $OSTYPE"
exit 0
fi
echo '::endgroup::'
echo "::group::Configuring ssh and ssh keys"
# generate ssh key
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
if [ ! -f ~/.ssh/id_rsa ]; then
ssh-keygen -q -t rsa -N "" -f ~/.ssh/id_rsa
fi
if [ ! -f ~/.ssh/id_ed25519 ]; then
ssh-keygen -q -t ed25519 -N "" -f ~/.ssh/id_ed25519
fi
# configure ssh
echo -e "Host *\nStrictHostKeyChecking no\nCheckHostIP no\nTCPKeepAlive yes\nServerAliveInterval 30\nServerAliveCountMax 180\nVerifyHostKeyDNS yes\nUpdateHostKeys yes\n" > ~/.ssh/config
# Auto-generate ~/.ssh/known_hosts by attempting connection to uptermd.upterm.dev
ssh -i ~/.ssh/id_ed25519 uptermd.upterm.dev || true
# @cert-authority entry is a mandatory entry when connecting to upterm. generate the entry based on the known_hosts entry key
cat <(cat ~/.ssh/known_hosts | awk '{ print "@cert-authority * " $2 " " $3 }') >> ~/.ssh/known_hosts
authorizedKeysParameter=""
authorizedKeysFile=${HOME}/.ssh/authorized_keys
if [[ "${{ inputs.secure-access }}" != "false" ]]; then
ssh-keygen -q -t ed25519 -N "$(echo $RANDOM | md5sum | awk '{ print $1 }')" -C "Prevent public access" -f /tmp/dummykey$$
cat /tmp/dummykey$$.pub >> $authorizedKeysFile
rm /tmp/dummykey$$ /tmp/dummykey$$.pub
fi
limit_access_to_actor="${{ inputs.limit-access-to-actor }}"
if [[ "${limit_access_to_actor}" == "true" ]]; then
echo "Adding ${GITHUB_ACTOR} to allowed users (identified by ssh key registered in GitHub)"
curl -s https://github.com/${GITHUB_ACTOR}.keys >> $authorizedKeysFile
fi
limit_access_to_users="${{ inputs.limit-access-to-users }}"
for github_user in ${limit_access_to_users//,/ }; do
if [[ -n "${github_user}" ]]; then
echo "Adding ${github_user} to allowed users (identified by ssh key registered in GitHub)"
curl -s https://github.com/${github_user}.keys >> $authorizedKeysFile
fi
done
if [ -f $authorizedKeysFile ]; then
chmod 0600 $authorizedKeysFile
authorizedKeysParameter="-a $authorizedKeysFile"
echo -e "Using $authorizedKeysFile\nContent:\n---------------------------"
cat $authorizedKeysFile
echo "---------------------------"
fi
echo '::endgroup::'
echo "::group::Starting terminal session and connecting to server"
tmux new -d -s upterm-wrapper -x 132 -y 43 "upterm host ${authorizedKeysParameter} --force-command 'tmux attach -t upterm' -- tmux new -s upterm -x 132 -y 43"
sleep 2
tmux send-keys -t upterm-wrapper q C-m
sleep 1
tmux set -t upterm-wrapper window-size largest
tmux set -t upterm window-size largest
echo '::endgroup::'
echo -e "\nSSH connection information"
# wait up to 10 seconds for upterm admin socket to appear
for i in {1..10}; do
ADMIN_SOCKET=$(find $HOME/.upterm -name "*.sock")
if [ ! -S "$ADMIN_SOCKET" ]; then
echo "Waiting for upterm admin socket to appear in ~/.upterm/*.sock ..."
sleep 1
else
echo "upterm admin socket available in $ADMIN_SOCKET"
break
fi
done
shopt -s nullglob
upterm session current --admin-socket ~/.upterm/*.sock || {
echo "Starting upterm failed."
exit 0
}
elif [[ "${{ inputs.action }}" == "wait" ]]; then
# only wait if upterm was installed
if command -v upterm &>/dev/null; then
shopt -s nullglob
echo "SSH connection information"
upterm session current --admin-socket ~/.upterm/*.sock || {
echo "upterm isn't running. Not waiting any longer."
exit 0
}
timeout=${{ inputs.timeout }}
echo "Waiting $timeout seconds..."
sleep $timeout
echo "Keep waiting as long as there's a connected session"
while upterm session current --admin-socket ~/.upterm/*.sock|grep Connected &>/dev/null; do
sleep 30
done
echo "No session is connected. Not waiting any longer."
else
echo "upterm isn't installed"
fi
fi
shell: bash

View File

@ -0,0 +1,96 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Tune Runner VM performance
description: tunes the GitHub Runner VM operation system
runs:
using: composite
steps:
- run: |
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo "::group::Configure and tune OS"
# Ensure that reverse lookups for current hostname are handled properly
# Add the current IP address, long hostname and short hostname record to /etc/hosts file
echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts
# The default vm.swappiness setting is 60 which has a tendency to start swapping when memory
# consumption is high.
# Set vm.swappiness=1 to avoid swapping and allow high RAM usage
echo 1 | sudo tee /proc/sys/vm/swappiness
(
shopt -s nullglob
# Set swappiness to 1 for all cgroups and sub-groups
for swappiness_file in /sys/fs/cgroup/memory/*/memory.swappiness /sys/fs/cgroup/memory/*/*/memory.swappiness; do
echo 1 | sudo tee $swappiness_file > /dev/null
done
) || true
# use "madvise" Linux Transparent HugePages (THP) setting
# https://www.kernel.org/doc/html/latest/admin-guide/mm/transhuge.html
# "madvise" is generally a better option than the default "always" setting
# Based on Azul instructions from https://docs.azul.com/prime/Enable-Huge-Pages#transparent-huge-pages-thp
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo advise | sudo tee /sys/kernel/mm/transparent_hugepage/shmem_enabled
echo defer+madvise | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
echo 1 | sudo tee /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# tune filesystem mount options, https://www.kernel.org/doc/Documentation/filesystems/ext4.txt
# commit=999999, effectively disables automatic syncing to disk (default is every 5 seconds)
# nobarrier/barrier=0, loosen data consistency on system crash (no negative impact to empheral CI nodes)
sudo mount -o remount,nodiscard,commit=999999,barrier=0 / || true
sudo mount -o remount,nodiscard,commit=999999,barrier=0 /mnt || true
# disable discard/trim at device level since remount with nodiscard doesn't seem to be effective
# https://www.spinics.net/lists/linux-ide/msg52562.html
for i in /sys/block/sd*/queue/discard_max_bytes; do
echo 0 | sudo tee $i
done
# disable any background jobs that run SSD discard/trim
sudo systemctl disable fstrim.timer || true
sudo systemctl stop fstrim.timer || true
sudo systemctl disable fstrim.service || true
sudo systemctl stop fstrim.service || true
# stop php-fpm
sudo systemctl stop php8.0-fpm.service || true
sudo systemctl stop php7.4-fpm.service || true
# stop mono-xsp4
sudo systemctl disable mono-xsp4.service || true
sudo systemctl stop mono-xsp4.service || true
sudo killall mono || true
# stop Azure Linux agent to save RAM
sudo systemctl stop walinuxagent.service || true
echo '::endgroup::'
# show memory
echo "::group::Available Memory"
free -m
echo '::endgroup::'
# show disk
echo "::group::Available diskspace"
df -BM
echo "::endgroup::"
# show cggroup
echo "::group::Cgroup settings for current cgroup $CURRENT_CGGROUP"
CURRENT_CGGROUP=$(cat /proc/self/cgroup | grep '0::' | awk -F: '{ print $3 }')
sudo cgget -a $CURRENT_CGGROUP || true
echo '::endgroup::'
fi
shell: bash

28
.github/changes-filter.yaml vendored Normal file
View File

@ -0,0 +1,28 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# contains pattern definitions used in workflows "changes" step
# pattern syntax: https://github.com/micromatch/picomatch
all:
- '**'
docs:
- 'examples/**'
- '.asf.yaml'
- '*.md'
- '**/*.md'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Helm Chart Lint
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- '.ci/ct.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Lint chart
id: lint
uses: helm/chart-testing-action@v2.0.0
with:
command: lint

View File

@ -0,0 +1,357 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Pulsar Helm Chart CI
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
preconditions:
name: Preconditions
runs-on: ubuntu-24.04
if: (github.event_name != 'schedule') || (github.repository == 'apache/pulsar-helm-chart')
outputs:
docs_only: ${{ steps.check_changes.outputs.docs_only }}
steps:
- name: checkout
uses: actions/checkout@v4
- name: Detect changed files
id: changes
uses: apache/pulsar-test-infra/paths-filter@master
with:
filters: .github/changes-filter.yaml
list-files: csv
- name: Check changed files
id: check_changes
run: |
if [[ "${GITHUB_EVENT_NAME}" != "schedule" && "${GITHUB_EVENT_NAME}" != "workflow_dispatch" ]]; then
echo "docs_only=${{ fromJSON(steps.changes.outputs.all_count) == fromJSON(steps.changes.outputs.docs_count) && fromJSON(steps.changes.outputs.docs_count) > 0 }}" >> $GITHUB_OUTPUT
else
echo docs_only=false >> $GITHUB_OUTPUT
fi
license-check:
needs: preconditions
name: License Check
runs-on: ubuntu-24.04
timeout-minutes: 10
if: ${{ needs.preconditions.outputs.docs_only != 'true' }}
steps:
- name: Set up Go 1.12
uses: actions/setup-go@v5
with:
go-version: 1.12
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v4
- name: Check license
run: |
go test license_test.go
# run "ct lint" https://github.com/helm/chart-testing/blob/main/doc/ct_lint.md
ct-lint:
needs: ['preconditions', 'license-check']
name: chart-testing lint
runs-on: ubuntu-24.04
timeout-minutes: 45
if: ${{ needs.preconditions.outputs.docs_only != 'true' }}
steps:
- name: checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Tune Runner VM
uses: ./.github/actions/tune-runner-vm
- name: Setup ssh access to build runner VM
# ssh access is enabled for builds in own forks
if: ${{ github.repository != 'apache/pulsar-helm-chart' && github.event_name == 'pull_request' }}
uses: ./.github/actions/ssh-access
continue-on-error: true
with:
limit-access-to-actor: true
- name: Set up Helm
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
uses: azure/setup-helm@v4
with:
version: v3.16.4
- name: Set up Python
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install uv, a fast modern package manager for Python
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
run: curl -LsSf https://astral.sh/uv/install.sh | sh
- name: Set up chart-testing
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
uses: ./.github/actions/chart-testing-action
- name: Run chart-testing (lint)
id: ct-lint
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
run: |
ct lint --check-version-increment=false \
--validate-maintainers=false \
--target-branch ${{ github.event.repository.default_branch }}
- name: Run kubeconform check for helm template with every major k8s version 1.25.0-1.32.0
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
run: |
PULSAR_CHART_HOME=$(pwd)
source ${PULSAR_CHART_HOME}/hack/common.sh
source ${PULSAR_CHART_HOME}/.ci/helm.sh
hack::ensure_kubectl
hack::ensure_helm
hack::ensure_kubeconform
ci::helm_repo_add
helm dependency build charts/pulsar
validate_helm_template_with_k8s_version() {
local kube_version=$1
shift
echo -n "Validating helm template with kubeconform for k8s version $kube_version"
if [ $# -gt 0 ]; then
echo " Extra args: $*"
else
echo ""
fi
helm template charts/pulsar --set victoria-metrics-k8s-stack.enabled=false --set components.pulsar_manager=true --kube-version $kube_version "$@" | \
kubeconform -schema-location default -schema-location 'https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json' -strict -kubernetes-version $kube_version -summary
}
set -o pipefail
for k8s_version_part in {25..32}; do
k8s_version="1.${k8s_version_part}.0"
echo "Validating default values with k8s version $k8s_version"
validate_helm_template_with_k8s_version $k8s_version
for config in .ci/clusters/*.yaml; do
echo "Validating $config with k8s version $k8s_version"
validate_helm_template_with_k8s_version $k8s_version --values .ci/values-common.yaml --values $config
done
done
- name: Validate kustomize yaml for extra new lines in pulsar-init commands
if: ${{ steps.check_changes.outputs.docs_only != 'true' }}
run: |
./.ci/helm.sh validate_kustomize_yaml
- name: Wait for ssh connection when build fails
# ssh access is enabled for builds in own forks
uses: ./.github/actions/ssh-access
if: ${{ failure() && github.repository != 'apache/pulsar-helm-chart' && github.event_name == 'pull_request' }}
continue-on-error: true
with:
action: wait
install-chart-tests:
name: ${{ matrix.testScenario.name }} - k8s ${{ matrix.k8sVersion.version }} - ${{ matrix.testScenario.type || 'install' }}
runs-on: ubuntu-24.04
timeout-minutes: ${{ matrix.testScenario.timeout || 45 }}
needs: ['preconditions', 'ct-lint']
if: ${{ needs.preconditions.outputs.docs_only != 'true' }}
strategy:
fail-fast: false
matrix:
# see https://github.com/kubernetes-sigs/kind/releases/tag/v0.27.0 for the list of supported k8s versions for kind 0.27.0
# docker images are available at https://hub.docker.com/r/kindest/node/tags
k8sVersion:
- version: "1.25.16"
kind_image_tag: v1.25.16@sha256:6110314339b3b44d10da7d27881849a87e092124afab5956f2e10ecdb463b025
- version: "1.32.2"
kind_image_tag: v1.32.2@sha256:f226345927d7e348497136874b6d207e0b32cc52154ad8323129352923a3142f
testScenario:
- name: Upgrade latest released version
values_file: .ci/clusters/values-upgrade.yaml
shortname: upgrade
type: upgrade
- name: Use previous LTS Pulsar Image
values_file: .ci/clusters/values-pulsar-previous-lts.yaml
shortname: pulsar-previous-lts
- name: JWT Asymmetric Keys
values_file: .ci/clusters/values-jwt-asymmetric.yaml
shortname: jwt-asymmetric
- name: JWT Symmetric Key
values_file: .ci/clusters/values-jwt-symmetric.yaml
shortname: jwt-symmetric
- name: TLS
values_file: .ci/clusters/values-tls.yaml
shortname: tls
- name: Broker & Proxy TLS
values_file: .ci/clusters/values-broker-tls.yaml
shortname: broker-tls
- name: BK TLS Only
values_file: .ci/clusters/values-bk-tls.yaml
shortname: bk-tls
- name: ZK TLS Only
values_file: .ci/clusters/values-zk-tls.yaml
shortname: zk-tls
- name: ZK & BK TLS Only
values_file: .ci/clusters/values-zkbk-tls.yaml
shortname: zkbk-tls
- name: Pulsar Manager
values_file: .ci/clusters/values-pulsar-manager.yaml
shortname: pulsar-manager
- name: Oxia
values_file: .ci/clusters/values-oxia.yaml
shortname: oxia
- name: OpenID
values_file: .ci/clusters/values-openid.yaml
shortname: openid
- name: CA certificates
values_file: .ci/clusters/values-cacerts.yaml
shortname: cacerts
include:
- k8sVersion:
version: "1.25.16"
kind_image_tag: v1.25.16@sha256:6110314339b3b44d10da7d27881849a87e092124afab5956f2e10ecdb463b025
testScenario:
name: "Upgrade TLS"
values_file: .ci/clusters/values-tls.yaml
shortname: tls
type: upgrade
- k8sVersion:
version: "1.25.16"
kind_image_tag: v1.25.16@sha256:6110314339b3b44d10da7d27881849a87e092124afab5956f2e10ecdb463b025
testScenario:
name: "Upgrade victoria-metrics-k8s-stack for previous LTS"
values_file: .ci/clusters/values-victoria-metrics-grafana.yaml --values .ci/clusters/values-pulsar-previous-lts.yaml
shortname: victoria-metrics-grafana
type: upgrade
upgradeFromVersion: 3.2.0
- k8sVersion:
version: "1.25.16"
kind_image_tag: v1.25.16@sha256:6110314339b3b44d10da7d27881849a87e092124afab5956f2e10ecdb463b025
testScenario:
name: "TLS with helm 3.12.0"
values_file: .ci/clusters/values-tls.yaml
shortname: tls
type: install
helmVersion: 3.12.0
env:
k8sVersion: ${{ matrix.k8sVersion.kind_image_tag }}
KUBECTL_VERSION: ${{ matrix.k8sVersion.version }}
HELM_VERSION: ${{ matrix.helmVersion || '3.14.4' }}
steps:
- name: checkout
uses: actions/checkout@v4
- name: Tune Runner VM
uses: ./.github/actions/tune-runner-vm
- name: Setup debugging tools for ssh access
if: ${{ github.repository != 'apache/pulsar-helm-chart' && github.event_name == 'pull_request' }}
run: .ci/configure_ci_runner_for_debugging.sh
- name: Setup ssh access to build runner VM
# ssh access is enabled for builds in own forks
if: ${{ github.repository != 'apache/pulsar-helm-chart' && github.event_name == 'pull_request' }}
uses: ./.github/actions/ssh-access
continue-on-error: true
with:
limit-access-to-actor: true
- name: Run chart-testing (${{ matrix.testScenario.type || 'install' }}) with helm ${{ env.HELM_VERSION }}
run: |
case "${{ matrix.testScenario.shortname }}" in
"jwt-symmetric")
export SYMMETRIC=true
export EXTRA_SUPERUSERS=manager-admin
;;
"jwt-asymmetric")
export EXTRA_SUPERUSERS=manager-admin
;;
"openid")
export AUTHENTICATION_PROVIDER=openid
;;
esac
if [[ "${{ matrix.testScenario.type || 'install' }}" == "upgrade" ]]; then
export UPGRADE_FROM_VERSION="${{ matrix.testScenario.upgradeFromVersion || 'latest' }}"
fi
.ci/chart_test.sh ${{ matrix.testScenario.values_file }}
- name: Collect k8s logs on failure
if: ${{ cancelled() || failure() }}
continue-on-error: true
shell: bash
run: |
source .ci/helm.sh
set +e
ci::collect_k8s_logs
- name: Upload k8s logs on failure
uses: actions/upload-artifact@v4
if: ${{ cancelled() || failure() }}
continue-on-error: true
with:
name: k8s-logs-${{ matrix.testScenario.shortname }}
path: /tmp/k8s-logs
retention-days: 7
if-no-files-found: ignore
- name: Wait for ssh connection when build fails
# ssh access is enabled for builds in own forks
uses: ./.github/actions/ssh-access
if: ${{ failure() && github.repository != 'apache/pulsar-helm-chart' && github.event_name == 'pull_request' }}
continue-on-error: true
with:
action: wait
# This job is required for pulls to be merged.
# It depends on all other jobs in this workflow.
pulsar-helm-chart-ci-checks-completed:
name: "CI checks completed"
if: ${{ always() && ((github.event_name != 'schedule') || (github.repository == 'apache/pulsar-helm-chart')) }}
runs-on: ubuntu-24.04
timeout-minutes: 10
needs: [
'preconditions',
'license-check',
'install-chart-tests'
]
steps:
- name: Check that all required jobs were completed successfully
if: ${{ needs.preconditions.outputs.docs_only != 'true' }}
run: |
if [[ ! ( \
"${{ needs.license-check.result }}" == "success" \
&& "${{ needs.install-chart-tests.result }}" == "success" \
) ]]; then
echo "Required jobs haven't been completed successfully."
exit 1
fi

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (Basic Installation)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Install chart
run: |
.ci/chart_test.sh .ci/clusters/values-local-pv.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (BK TLS Only)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Run chart-testing (install)
run: |
.ci/chart_test.sh .ci/clusters/values-bk-tls.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (Broker & Proxy TLS Installation)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Run chart-testing (install)
run: |
.ci/chart_test.sh .ci/clusters/values-broker-tls.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,50 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (Pulsar Function)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Install chart
run: |
.ci/chart_test.sh .ci/clusters/values-function.yaml
env:
FUNCTION: "true"
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (Use Pulsar Image)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Install chart
run: |
.ci/chart_test.sh .ci/clusters/values-pulsar-image.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,50 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (JWT Secret Key Installation)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Run chart-testing (install)
run: |
.ci/chart_test.sh .ci/clusters/values-jwt-asymmetric.yaml
env:
SYMMETRIC: "false"
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,50 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (JWT Public/Private Key Installation)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Run chart-testing (install)
run: |
.ci/chart_test.sh .ci/clusters/values-jwt-symmetric.yaml
env:
SYMMETRIC: "true"
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (TLS Installation)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Install chart
run: |
.ci/chart_test.sh .ci/clusters/values-tls.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (ZK TLS Only)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Install chart
run: |
.ci/chart_test.sh .ci/clusters/values-zk-tls.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

View File

@ -1,48 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: Precommit - Pulsar Helm Chart (ZK & BK TLS Only)
on:
pull_request:
branches:
- '*'
paths:
- 'charts/pulsar/**'
- 'hack/kind-cluster-build.sh'
jobs:
lint-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Check if this pull request only changes documentation
id: docs
uses: apache/pulsar-test-infra/diff-only@master
with:
args: site2 .asf.yaml ct.yaml
- name: Install chart
run: |
.ci/chart_test.sh .ci/clusters/values-zkbk-tls.yaml
# Only build a kind cluster if there are chart changes to test.
if: steps.docs.outputs.changed_only == 'no'

1
.gitignore vendored
View File

@ -16,3 +16,4 @@ charts/**/*.lock
PRIVATEKEY
PUBLICKEY
.vagrant/

20
.rat-excludes Normal file
View File

@ -0,0 +1,20 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
.gitignore
# Generated Helm file
Chart.lock

239
LICENSE Normal file
View File

@ -0,0 +1,239 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
----------------------------------------------------------------------------------------------------
pulsar-common/src/main/java/org/apache/pulsar/common/util/protobuf/ByteBufCoded{Input,Output}Stream.java
Copyright 2014, Google Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Code generated by the Protocol Buffer compiler is owned by the owner
of the input file used when generating it. This code is not
standalone and requires a support library to be linked with it. This
support library is itself covered by the above license.

5
NOTICE Normal file
View File

@ -0,0 +1,5 @@
Apache Pulsar
Copyright 2017-2022 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

485
README.md
View File

@ -18,11 +18,121 @@
under the License.
-->
# Official Apache Pulsar Helm Chart
This is the officially supported Helm Chart for installing Apache Pulsar on Kubernetes.
# Apache Pulsar Helm Chart
Read [Deploying Pulsar on Kubernetes](http://pulsar.apache.org/docs/en/deploy-kubernetes/) for more details.
This project provides Helm Charts for installing Apache Pulsar on Kubernetes.
Read [Deploying Pulsar on Kubernetes](http://pulsar.apache.org/docs/deploy-kubernetes/) for more details.
> :warning: This helm chart is updated outside of the regular Pulsar release cycle and might lag behind a bit. It only supports basic Kubernetes features now. Currently, it can be used as no more than a template and starting point for a Kubernetes deployment. In many cases, it would require some customizations.
## Important Security Advisory for Helm Chart Usage
### Notice of Default Configuration
This Helm chart's default configuration DOES NOT meet production security requirements.
Users MUST review and customize security settings for their specific environment.
IMPORTANT: This Helm chart provides a starting point for Pulsar deployments but requires
significant security customization before use in production environments. We strongly
recommend implementing:
1. Authentication and authorization for all components
2. TLS encryption for all communication channels
3. Proper network isolation and access controls
4. Regular security updates and vulnerability assessments
As an open source project, we welcome contributions to improve security features.
Please consider submitting pull requests to address security gaps or enhance
existing security implementations.
### Pulsar Proxy Security Considerations
As per the [Pulsar Proxy documentation](https://pulsar.apache.org/docs/3.1.x/administration-proxy/), it is explicitly stated that the Pulsar proxy is not designed for exposure to the public internet. The design assumes that deployments will be protected by network perimeter security measures. It is crucial to understand that relying solely on the default configuration can expose your deployment to significant security vulnerabilities.
### Upgrading
#### To 4.1.0
This version introduces `OpenID` authentication. Setting `auth.authentication.provider` is no longer supported, you need to enable the provider with `auth.authentication.<provider>.enabled`.
#### To 4.0.0
The default service type for the Pulsar proxy has changed from `LoadBalancer` to `ClusterIP` for security reasons. This limits access to within the Kubernetes environment by default.
### External Access Recommendations
If you need to expose the Pulsar Proxy outside the cluster:
1. **USE INTERNAL LOAD BALANCERS ONLY**
- Set type to LoadBalancer only in secured environments with proper network controls
- Add cloud provider-specific annotations for internal load balancers:
- Kubernetes documentation about internal load balancers:
- [Internal load balancer](https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer)
- See cloud provider documentation:
- AWS / EKS: [AWS Load Balancer Controller / Service Annotations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)
- Azure / AKS: [Use an internal load balancer with Azure Kubernetes Service (AKS)](https://learn.microsoft.com/en-us/azure/aks/internal-lb)
- GCP / GKE: [LoadBalancer service parameters](https://cloud.google.com/kubernetes-engine/docs/concepts/service-load-balancer-parameters)
- Examples (verify correctness for your environment):
- AWS / EKS: `service.beta.kubernetes.io/aws-load-balancer-internal: "true"`
- Azure / AKS: `service.beta.kubernetes.io/azure-load-balancer-internal: "true"`
- GCP / GKE: `networking.gke.io/load-balancer-type: "Internal"`
2. **IMPLEMENT AUTHENTICATION AND AUTHORIZATION**
- Configure all clients to authenticate properly
- Set up appropriate authorization policies
3. **USE TLS FOR ALL CONNECTIONS**
- Enable TLS for client-to-proxy connections
- Enable TLS for proxy-to-broker connections
- Enable TLS for all internal cluster communications
- Note: TLS alone is NOT sufficient as a security solution. Even with TLS enabled, clusters exposed to untrusted networks remain vulnerable to denial-of-service attacks, authentication bypass attempts, and protocol-level exploits.
4. **NETWORK SECURITY**
- Use private networks (VPCs)
- Configure firewalls, security groups, and IP restrictions
5. **CLIENT IP ADDRESS BASED ACCESS RESTRICTIONS**
- When using a LoadBalancer service type, restrict access to specific IP ranges by configuring `proxy.service.loadBalancerSourceRanges` in your values.yaml:
```yaml
proxy:
service:
loadBalancerSourceRanges:
- 10.0.0.0/8 # Private network range
- 172.16.0.0/12 # Private network range
- 192.168.0.0/16 # Private network range
```
- This feature:
- Provides an additional defense layer by filtering traffic at the load balancer level
- Only allows connections from specified CIDR blocks
- Works only with LoadBalancer service type and when your cloud provider supports the `loadBalancerSourceRanges` parameter
- Important: This should be implemented alongside other security measures (internal load balancer, authentication, TLS, network policies) as part of a defense-in-depth strategy,
not as a standalone security solution
### Alternative for External Access
As an alternative method for external access, Pulsar has support for [SNI proxy routing](https://pulsar.apache.org/docs/next/concepts-proxy-sni-routing/). SNI Proxy routing is supported with proxy servers such as Apache Traffic Server, HAProxy and Nginx.
Note: This option isn't currently implemented in the Apache Pulsar Helm chart.
**IMPORTANT**: Pulsar binary protocol cannot be exposed outside of the Kubernetes cluster using Kubernetes Ingress. Kubernetes Ingress works for the Admin REST API and topic lookups, but clients would be connecting to the advertised listener addresses returned by the brokers and it would only work when clients can connect directly to brokers. This is not a supported secure option for exposing Pulsar to untrusted networks.
### General Recommendations
- **Network Perimeter Security:** It is imperative to implement robust network perimeter security to safeguard your deployment. The absence of such security measures can lead to unauthorized access and potential data breaches.
- **Restricted Access:** For environments where security is less critical, such as certain development or testing scenarios, the use of `loadBalancerSourceRanges` may be employed to restrict access to specified IP addresses or ranges. This, however, should not be considered a substitute for comprehensive security measures in production environments.
### User Responsibility
The user assumes full responsibility for the security and integrity of their deployment. This includes, but is not limited to, the proper configuration of security features and adherence to best practices for securing network access. The providers of this Helm chart disclaim all warranties, whether express or implied, including any warranties of merchantability, fitness for a particular purpose, and non-infringement of third-party rights.
### No Security Guarantees
The providers of this Helm chart make no guarantees regarding the security of the chart under any circumstances. It is the user's responsibility to ensure that their deployment is secure and complies with all relevant security standards and regulations.
By using this Helm chart, the user acknowledges the risks associated with its default configuration and the necessity for proper security customization. The user further agrees that the providers of the Helm chart shall not be liable for any security breaches or incidents resulting from the use of the chart.
## Features
@ -36,8 +146,8 @@ This Helm Chart includes all the components of Apache Pulsar for a complete expe
- [x] Proxies
- [x] Management & monitoring components:
- [x] Pulsar Manager
- [x] Prometheus
- [x] Grafana
- [x] Optional PodMonitors for each component (enabled by default)
- [x] [victoria-metrics-k8s-stack](hhttps://github.com/VictoriaMetrics/helm-charts/tree/master/charts/victoria-metrics-k8s-stack) (as of 4.0.0)
It includes support for:
@ -50,17 +160,19 @@ It includes support for:
- [x] Broker
- [x] Toolset
- [x] Bookie
- [x] ZooKeeper
- [x] ZooKeeper (requires the `AdditionalCertificateOutputFormats=true` feature gate to be enabled in the cert-manager deployment when using cert-manager versions below 1.15.0)
- [x] Authentication
- [x] JWT
- [x] OpenID
- [ ] Mutal TLS
- [ ] Kerberos
- [x] Authorization
- [x] Non-root broker, bookkeeper, proxy, and zookeeper containers (version 2.10.0 and above)
- [x] Storage
- [x] Non-persistence storage
- [x] Persistence Volume
- [x] Local Persistent Volumes
- [ ] Tiered Storage
- [x] Tiered Storage
- [x] Functions
- [x] Kubernetes Runtime
- [x] Process Runtime
@ -72,9 +184,9 @@ It includes support for:
In order to use this chart to deploy Apache Pulsar on Kubernetes, the followings are required.
1. kubectl 1.14 or higher, compatible with your cluster ([+/- 1 minor release from your cluster](https://kubernetes.io/docs/tasks/tools/install-kubectl/#before-you-begin))
2. Helm v3 (3.0.2 or higher)
3. A Kubernetes cluster, version 1.14 or higher.
1. kubectl 1.25 or higher, compatible with your cluster ([+/- 1 minor release from your cluster](https://kubernetes.io/docs/tasks/tools/install-kubectl/#before-you-begin))
2. Helm v3 (3.12.0 or higher)
3. A Kubernetes cluster, version 1.25 or higher.
## Environment setup
@ -82,67 +194,69 @@ Before proceeding to deploying Pulsar, you need to prepare your environment.
### Tools
`helm` and `kubectl` need to be [installed on your computer](http://pulsar.apache.org/docs/en/helm-tools/).
`helm` and `kubectl` need to be [installed on your computer](https://pulsar.apache.org/docs/helm-tools/).
## Add to local Helm repository
To add this chart to your local Helm repository:
```bash
helm repo add apache https://pulsar.apache.org/charts
```
To use the helm chart:
> NOTE: Please specify `--set initialize=true` when installing a release at the first time. `initialize=true` will start initialize jobs
> to initialize the cluster metadata for both bookkeeper and pulsar clusters.
```bash
helm install --set initialize=true <release-name> apache/pulsar
helm repo add apachepulsar https://pulsar.apache.org/charts
helm repo update
```
## Kubernetes cluster preparation
You need a Kubernetes cluster whose version is 1.14 or higher in order to use this chart, due to the usage of certain Kubernetes features.
You need a Kubernetes cluster whose version is 1.25 or higher in order to use this chart, due to the usage of certain Kubernetes features.
We provide some instructions to guide you through the preparation: http://pulsar.apache.org/docs/en/helm-prepare/
We provide some instructions to guide you through the preparation: http://pulsar.apache.org/docs/helm-prepare/
## Deploy Pulsar to Kubernetes
1. Clone the Pulsar Helm charts repository.
1. Configure your values file. The best way to know which values are available is to read the [values.yaml](./charts/pulsar/values.yaml).
A best practice is to start with an empty values file and only set the keys that differ from the default configuration.
```bash
git clone https://github.com/apache/pulsar-helm-chart
```
```bash
cd pulsar-helm-chart
Anti-affinity rules for Zookeeper and Bookie components require at least one node per replica. For Kubernetes clusters with less than 3 nodes,
you must disable this feature by adding this to your initial values.yaml file:
```yaml
affinity:
anti_affinity: false
```
2. Run `prepare_helm_release.sh` to create required kubernetes resources for installing this Helm chart.
- A k8s namespace for installing the Pulsar release (if `-c` is specified)
- Create the JWT secret keys and tokens for three superusers: `broker-admin`, `proxy-admin`, and `admin`.
By default, it generates asymmetric pubic/private key pair. You can choose to generate symmetric secret key
by specifying `--symmetric` in the following command.
- `proxy-admin` role is used for proxies to communicate to brokers.
- `broker-admin` role is used for inter-broker communications.
- `admin` role is used by the admin tools.
2. Install the chart:
```bash
./scripts/pulsar/prepare_helm_release.sh -n <k8s-namespace> -k <pulsar-release-name> -c
helm install -n <namespace> --create-namespace <release-name> -f your-values.yaml apachepulsar/pulsar
```
3. Use the Pulsar Helm charts to install Apache Pulsar.
3. Observe the deployment progress
> NOTE: Please specify `--set initialize=true` when installing a release at the first time. `initialize=true` will start initialize jobs
> to initialize the cluster metadata for both bookkeeper and pulsar clusters.
Watching events to view progress of deployment:
This command installs and starts Apache Pulsar.
```bash
$ helm install --set initialize=true <pulsar-release-name> apache/pulsar
```shell
kubectl get -n <namespace> events -o wide --watch
```
5. Access the Pulsar cluster
Watching state of deployed Kubernetes objects, updated every 2 seconds:
```shell
watch kubectl get -n <namespace> all
```
Waiting until Pulsar Proxy is available:
```shell
kubectl wait --timeout=600s --for=condition=ready pod -n <namespace> -l component=proxy
```
Watching state with k9s (https://k9scli.io/topics/install/):
```shell
k9s -n <namespace>
```
4. Access the Pulsar cluster
The default values will create a `ClusterIP` for the proxy you can use to interact with the cluster. To find the IP address of proxy use:
@ -151,11 +265,11 @@ We provide some instructions to guide you through the preparation: http://pulsar
```
For more information, please follow our detailed
[quick start guide](http://pulsar.apache.org/docs/en/kubernetes-helm/).
[quick start guide](https://pulsar.apache.org/docs/getting-started-helm/).
## Customize the deployment
We provide a [detailed guideline](http://pulsar.apache.org/docs/en/helm-deploy/) for you to customize
We provide a [detailed guideline](https://pulsar.apache.org/docs/helm-deploy/) for you to customize
the Helm Chart for a production-ready deployment.
You can also checkout out the example values file for different deployments.
@ -169,30 +283,250 @@ You can also checkout out the example values file for different deployments.
- [Deploy a Pulsar cluster with JWT authentication using symmetric key](examples/values-jwt-symmetric.yaml)
- [Deploy a Pulsar cluster with JWT authentication using asymmetric key](examples/values-jwt-asymmetric.yaml)
## Disabling victoria-metrics-k8s-stack components
In order to disable the victoria-metrics-k8s-stack, you can add the following to your `values.yaml`.
Victoria Metrics components can also be disabled and enabled individually if you only need specific monitoring features.
```yaml
# disable VictoriaMetrics and related components
victoria-metrics-k8s-stack:
enabled: false
victoria-metrics-operator:
enabled: false
vmsingle:
enabled: false
vmagent:
enabled: false
kube-state-metrics:
enabled: false
prometheus-node-exporter:
enabled: false
grafana:
enabled: false
Additionally, you'll need to set each component's `podMonitor` property to `false`.
```yaml
# disable pod monitors
autorecovery:
podMonitor:
enabled: false
bookkeeper:
podMonitor:
enabled: false
oxia:
server:
podMonitor:
enabled: false
coordinator:
podMonitor:
enabled: false
broker:
podMonitor:
enabled: false
proxy:
podMonitor:
enabled: false
zookeeper:
podMonitor:
enabled: false
```
This is shown in some [examples/values-disable-monitoring.yaml](examples/values-disable-monitoring.yaml).
## Pulsar Manager
The Pulsar Manager can be deployed alongside the pulsar cluster instance.
Depending on the given settings it uses an existing Secret within the given namespace or creates a new one, with random
passwords for both, the UI and the internal database.
To forward the UI use (assumes you did not change the namespace):
```
kubectl port-forward $(kubectl get pods -l component=pulsar-manager -o jsonpath='{.items[0].metadata.name}') 9527:9527
```
And then opening the browser to http://localhost:9527
The default user is `pulsar` and you can find out the password with this command
```
kubectl get secret -l component=pulsar-manager -o=jsonpath="{.items[0].data.UI_PASSWORD}" | base64 --decode
```
## Grafana Dashboards
The Apache Pulsar Helm Chart uses the `victoria-metrics-k8s-stack` Helm Chart to deploy Grafana.
There are several ways to configure Grafana dashboards. The default [`values.yaml`](charts/pulsar/values.yaml) comes with examples of Pulsar dashboards which get downloaded from the Apache-2.0 licensed [lhotari/pulsar-grafana-dashboards OSS project](https://github.com/lhotari/pulsar-grafana-dashboards) by URL.
Dashboards can be configured in [`values.yaml`](charts/pulsar/values.yaml) or by adding `ConfigMap` items with the label `grafana_dashboard: "1"`.
In [`values.yaml`](charts/pulsar/values.yaml), it's possible to include dashboards by URL or by grafana.com dashboard id (`gnetId` and `revision`).
Please see the [Grafana Helm chart documentation for importing dashboards](https://github.com/grafana/helm-charts/blob/main/charts/grafana/README.md#import-dashboards).
You can connect to Grafana by forwarding port 3000
```
kubectl port-forward $(kubectl get pods -l app.kubernetes.io/name=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000
```
And then opening the browser to http://localhost:3000 . The default user is `admin`.
You can find out the password with this command
```
kubectl get secret -l app.kubernetes.io/name=grafana -o=jsonpath="{.items[0].data.admin-password}" | base64 --decode
```
### Pulsar Grafana Dashboards
* The `apache/pulsar` GitHub repo contains some Grafana dashboards [here](https://github.com/apache/pulsar/tree/master/grafana).
* StreamNative provides Grafana Dashboards for Apache Pulsar in this [GitHub repository](https://github.com/streamnative/apache-pulsar-grafana-dashboard).
* DataStax provides Grafana Dashboards for Apache Pulsar in this [GitHub repository](https://github.com/datastax/pulsar-helm-chart/tree/master/helm-chart-sources/pulsar/grafana-dashboards).
Note: if you have third party dashboards that you would like included in this list, please open a pull request.
## Upgrading
Once your Pulsar Chart is installed, configuration changes and chart
updates should be done using `helm upgrade`.
```bash
helm repo add apache https://pulsar.apache.org/charts
helm repo add apachepulsar https://pulsar.apache.org/charts
helm repo update
helm get values <pulsar-release-name> > pulsar.yaml
helm upgrade -f pulsar.yaml \
<pulsar-release-name> apache/pulsar
# If you are using the provided victoria-metrics-k8s-stack for monitoring, this installs or upgrades the required CRDs
./scripts/victoria-metrics-k8s-stack/upgrade_vm_operator_crds.sh
# get the existing values.yaml used for the most recent deployment
helm get values -n <namespace> <pulsar-release-name> > values.yaml
# upgrade the deployment
helm upgrade -n <namespace> -f values.yaml <pulsar-release-name> apachepulsar/pulsar
```
For more detailed information, see our [Upgrading](http://pulsar.apache.org/docs/en/helm-upgrade/) guide.
For more detailed information, see our [Upgrading](http://pulsar.apache.org/docs/helm-upgrade/) guide.
## Upgrading to Helm chart version 4.2.0 (not released yet)
### TLS configuration for ZooKeeper has changed
The TLS configuration for ZooKeeper has been changed to fix certificate and private key expiration issues.
This change impacts configurations that have `tls.enabled` and `tls.zookeeper.enabled` set in `values.yaml`.
The revised solution requires the `AdditionalCertificateOutputFormats=true` feature gate to be enabled in the `cert-manager` deployment when using cert-manager versions below 1.15.0.
If you installed `cert-manager` using `./scripts/cert-manager/install-cert-manager.sh`, you can re-run the updated script to set the feature gate. The script currently installs or upgrades cert-manager LTS version 1.12.17, where the feature gate must be explicitly enabled.
## Upgrading from Helm Chart versions before 4.0.0 to 4.0.0 version and above
### Pulsar Proxy service's default type has been changed from `LoadBalancer` to `ClusterIP`
Please check the section "External Access Recommendations" for guidance and also check the security advisory section.
You will need to configure keys under `proxy.service` in your `values.yaml` to preserve existing functionality since the default has been changed.
### kube-prometheus-stack replaced with victoria-metrics-k8s-stack
The `kube-prometheus-stack` was replaced with `victoria-metrics-k8s-stack` in Pulsar Helm chart version 4.0.0. The trigger for the change was incompatibilities discovered in testing with most recent `kube-prometheus-stack` and Prometheus 3.2.1 which failed to scrape Pulsar metrics in certain cases without providing proper error messages or debug information at debug level logging.
[Victoria Metrics](https://docs.victoriametrics.com/) is Apache 2.0 Licensed OSS and it's a fully compatible drop-in replacement for Prometheus which is fast and efficient.
Before upgrading to Pulsar Helm Chart version 4.0.0, it is recommended to disable kube-prometheus-stack in the original Helm chart version that
is used:
```shell
# get the existing values.yaml used for the most recent deployment
helm get values -n <namespace> <pulsar-release-name> > values.yaml
# disable kube-prometheus-stack in the currently used version before upgrading to Pulsar Helm chart 4.0.0
helm upgrade -n <namespace> -f values.yaml --version <your-current-chart-version> --set kube-prometheus-stack.enabled=false <pulsar-release-name> apachepulsar/pulsar
```
After, this you can proceed with `helm upgrade`.
## Upgrading to Apache Pulsar 2.10.0 and above (or Helm Chart version 3.0.0 and above)
The 2.10.0+ Apache Pulsar docker image is a non-root container, by default. That complicates an upgrade to 2.10.0
because the existing files are owned by the root user but are not writable by the root group. In order to leverage this
new security feature, the Bookkeeper and Zookeeper StatefulSet [securityContexts](https://kubernetes.io/docs/tasks/configure-pod-container/security-context)
are configurable in the [`values.yaml`](charts/pulsar/values.yaml). They default to:
```yaml
securityContext:
fsGroup: 0
fsGroupChangePolicy: "OnRootMismatch"
```
This configuration is ideal for regular Kubernetes clusters where the UID is stable across restarts. If the process
UID is subject to change (like it is in OpenShift), you'll need to set `fsGroupChangePolicy: "Always"`.
The official docker image assumes that it is run as a member of the root group.
If you upgrade to the latest version of the helm chart before upgrading to Pulsar 2.10.0, then when you perform your
first upgrade to version >= 2.10.0, you will need to set `fsGroupChangePolicy: "Always"` on the first upgrade and then
set it back to `fsGroupChangePolicy: "OnRootMismatch"` on subsequent upgrades. This is because the root file won't
mismatch permissions, but the RocksDB lock file will. If you have direct access to the persistent volumes, you can
alternatively run `chgrp -R g+w /pulsar/data` before upgrading.
Here is a sample error you can expect if the RocksDB lock file is not correctly owned by the root group:
```text
2022-05-14T03:45:06,903+0000 ERROR org.apache.bookkeeper.server.Main - Failed to build bookie server
java.io.IOException: Error open RocksDB database
at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:199) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:88) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.lambda$static$0(KeyValueStorageRocksDB.java:62) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.storage.ldb.LedgerMetadataIndex.<init>(LedgerMetadataIndex.java:68) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.storage.ldb.SingleDirectoryDbLedgerStorage.<init>(SingleDirectoryDbLedgerStorage.java:169) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage.newSingleDirectoryDbLedgerStorage(DbLedgerStorage.java:150) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage.initialize(DbLedgerStorage.java:129) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.bookie.Bookie.<init>(Bookie.java:818) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.proto.BookieServer.newBookie(BookieServer.java:152) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.proto.BookieServer.<init>(BookieServer.java:120) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.server.service.BookieService.<init>(BookieService.java:52) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.server.Main.buildBookieServer(Main.java:304) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.server.Main.doMain(Main.java:226) [org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
at org.apache.bookkeeper.server.Main.main(Main.java:208) [org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
Caused by: org.rocksdb.RocksDBException: while open a file for lock: /pulsar/data/bookkeeper/ledgers/current/ledgers/LOCK: Permission denied
at org.rocksdb.RocksDB.open(Native Method) ~[org.rocksdb-rocksdbjni-6.10.2.jar:?]
at org.rocksdb.RocksDB.open(RocksDB.java:239) ~[org.rocksdb-rocksdbjni-6.10.2.jar:?]
at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:196) ~[org.apache.bookkeeper-bookkeeper-server-4.14.4.jar:4.14.4]
... 13 more
```
### Recovering from `helm upgrade` error "unable to build kubernetes objects from current release manifest"
Example of the error message:
```bash
Error: UPGRADE FAILED: unable to build kubernetes objects from current release manifest:
[resource mapping not found for name: "pulsar-bookie" namespace: "pulsar" from "":
no matches for kind "PodDisruptionBudget" in version "policy/v1beta1" ensure CRDs are installed first,
resource mapping not found for name: "pulsar-broker" namespace: "pulsar" from "":
no matches for kind "PodDisruptionBudget" in version "policy/v1beta1" ensure CRDs are installed first,
resource mapping not found for name: "pulsar-zookeeper" namespace: "pulsar" from "":
no matches for kind "PodDisruptionBudget" in version "policy/v1beta1" ensure CRDs are installed first]
```
Helm documentation [explains issues with managing releases deployed using outdated APIs](https://helm.sh/docs/topics/kubernetes_apis/#helm-users) when the Kubernetes cluster has been upgraded
to a version where these APIs are removed. This happens regardless of whether the chart in the upgrade includes supported API versions.
In this case, you can use the following workaround:
1. Install the [Helm mapkubeapis plugin](https://github.com/helm/helm-mapkubeapis):
```bash
helm plugin install https://github.com/helm/helm-mapkubeapis
```
2. Run the `helm mapkubeapis` command with the appropriate namespace and release name. In this example, we use the namespace "pulsar" and release name "pulsar":
```bash
helm mapkubeapis --namespace pulsar pulsar
```
This workaround addresses the issue by updating in-place Helm release metadata that contains deprecated or removed Kubernetes APIs to a new instance with supported Kubernetes APIs and should allow for a successful Helm upgrade.
## Uninstall
To uninstall the Pulsar Chart, run the following command:
```bash
helm delete <pulsar-release-name>
helm uninstall <pulsar-release-name>
```
For the purposes of continuity, these charts have some Kubernetes objects that are not removed when performing `helm delete`.
For the purposes of continuity, these charts have some Kubernetes objects that are not removed when performing `helm uninstall`.
These items we require you to *conciously* remove them, as they affect re-deployment should you choose to.
* PVCs for stateful data, which you must *consciously* remove
@ -207,15 +541,36 @@ We've done our best to make these charts as seamless as possible,
occasionally troubles do surface outside of our control. We've collected
tips and tricks for troubleshooting common issues. Please examine these first before raising an [issue](https://github.com/apache/pulsar-helm-chart/issues/new/choose), and feel free to add to them by raising a [Pull Request](https://github.com/apache/pulsar-helm-chart/compare)!
### VictoriaMetrics Troubleshooting
In example commands, k8s is namespace `pulsar` replace with your deployment namespace.
#### VictoriaMetrics Web UI
Connecting to `vmsingle` pod for web UI.
```shell
kubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l app.kubernetes.io/name=vmsingle -o jsonpath='{.items[0].metadata.name}') 8429:8429
```
Now you can access the UI at http://localhost:8429 and http://localhost:8429/vmui (for similar UI as in Prometheus)
#### VictoriaMetrics Scraping debugging UI - Active Targets
Connection to `vmagent` pod for debugging targets.
```shell
kubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l app.kubernetes.io/name=vmagent -o jsonpath='{.items[0].metadata.name}') 8429:8429
```
Now you can access the UI at http://localhost:8429
Active Targets UI
- http://localhost:8429/targets
Scraping Configuration
- http://localhost:8429/config
## Release Process
1. Bump the version in [charts/pulsar/Chart.yaml](https://github.com/apache/pulsar-helm-chart/blob/master/charts/pulsar/Chart.yaml#L24).
2. Send a pull request for reviews.
3. After the pull request is approved, merge it. The release workflow will be triggered automatically.
- It creates a tag named `pulsar-<version>`.
- Published the packaged helm chart to Github releases.
- Update the `charts/index.yaml` in Pulsar website.
4. Trigger the Pulsar website build to make the release available under https://pulsar.apache.org/charts.
See [RELEASE.md](RELEASE.md)

652
RELEASE.md Normal file
View File

@ -0,0 +1,652 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
This document details the steps for releasing the Apache Pulsar Helm Chart.
# Prepare the Apache Pulsar Helm Chart Release Candidate
## Prerequisites
- Helm version >= 3.12.0
- Helm gpg plugin (one option: https://github.com/technosophos/helm-gpg)
## Build Release Notes
Before creating the RC, you need to build and commit the release notes for the release.
## Build RC artifacts
The Release Candidate artifacts we vote upon should be the exact ones we vote against,
without any modification than renaming i.e. the contents of the files must be
the same between voted release candidate and final release.
Because of this the version in the built artifacts that will become the
official Apache releases must not include the rcN suffix.
- Set environment variables
```shell
# Set Version
export VERSION_RC=3.0.0-candidate-1
export VERSION_WITHOUT_RC=${VERSION_RC%-candidate-*}
# set your ASF user id
export APACHE_USER=<your ASF userid>
```
- Clone clean repository and set PULSAR_REPO_ROOT
```shell
git clone https://github.com/apache/pulsar-helm-chart.git
cd pulsar-helm-chart
export PULSAR_REPO_ROOT=$(pwd)
```
- Alternatively (not recommended), go to your already checked out pulsar-helm-chart directory and ensure that it's clean
```shell
git checkout master
git fetch origin
git reset --hard origin/master
# clean the checkout
git clean -fdX .
export PULSAR_REPO_ROOT=$(pwd)
```
- Update Helm Chart version in `Chart.yaml`, example: `version: 1.0.0` (without
the RC tag). Verify that the `appVersion` matches the `values.yaml` versions for Pulsar components.
```shell
yq -i '.version=strenv(VERSION_WITHOUT_RC)' charts/pulsar/Chart.yaml
```
- Add and commit the version change.
```shell
git add charts/pulsar/Chart.yaml
git commit -m "Chart: Bump version to $VERSION_WITHOUT_RC"
git push origin master
```
Note: You will tag this commit, you do not need to open a PR for it.
- Tag your release
```shell
git tag -u $APACHE_USER@apache.org -s pulsar-${VERSION_RC} -m "Apache Pulsar Helm Chart $VERSION_RC"
```
- Tarball the repo
NOTE: Make sure your checkout is clean at this stage - any untracked or changed files will otherwise be included
in the file produced.
```shell
git archive --format=tar.gz pulsar-${VERSION_RC} --prefix=pulsar-chart-${VERSION_WITHOUT_RC}/ \
-o pulsar-chart-${VERSION_WITHOUT_RC}-source.tar.gz .
```
- Generate chart binary
```shell
helm package charts/pulsar --dependency-update
```
- Sign the chart binary
In the following command, replace the email address with your email address or your KEY ID
so GPG uses the right key to sign the chart.
(If you have not generated a key yet, generate it by following instructions on
http://www.apache.org/dev/openpgp.html#key-gen-generate-key)
```shell
helm gpg sign -u $APACHE_USER@apache.org pulsar-${VERSION_WITHOUT_RC}.tgz
```
Warning: you need the `helm gpg` plugin to sign the chart. It can be found at: https://github.com/technosophos/helm-gpg
This should also generate a provenance file (Example: `pulsar-1.0.0.tgz.prov`) as described in
https://helm.sh/docs/topics/provenance/, which can be used to verify integrity of the Helm chart.
Verify the signed chart:
```shell
helm gpg verify pulsar-${VERSION_WITHOUT_RC}.tgz
```
Example output:
```
gpg: Signature made Thu Oct 20 16:36:24 2022 CDT
gpg: using RSA key BD4291E509D771B79E7BD1F5C5724B3F5588C4EB
gpg: issuer "mmarshall@apache.org"
gpg: Good signature from "Michael Marshall <mmarshall@apache.org>" [ultimate]
plugin: Chart SHA verified. sha256:deb035dcb765b1989ed726eabe3d7d89529df05658c8eec6cdd4dc213fa0513e
```
- Generate SHA512/ASC
```shell
${PULSAR_REPO_ROOT}/scripts/sign.sh pulsar-chart-${VERSION_WITHOUT_RC}-source.tar.gz
${PULSAR_REPO_ROOT}/scripts/sign.sh pulsar-${VERSION_WITHOUT_RC}.tgz
```
- Move the artifacts to ASF dev dist repo, generate convenience `index.yaml` & publish them
```shell
# Create new folder for the release
svn mkdir --username $APACHE_USER -m "Add directory for pulsar-helm-chart $VERSION_RC release" https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/$VERSION_RC
# checkout the directory
svn co --username $APACHE_USER https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/$VERSION_RC helm-chart-$VERSION_RC
# Move the artifacts to svn folder
mv ${PULSAR_REPO_ROOT}/pulsar-${VERSION_WITHOUT_RC}.tgz* helm-chart-${VERSION_RC}/
mv ${PULSAR_REPO_ROOT}/pulsar-chart-${VERSION_WITHOUT_RC}-source.tar.gz* helm-chart-${VERSION_RC}/
cd helm-chart-${VERSION_RC}/
###### Generate index.yaml file - Start
# Download the latest index.yaml on Pulsar Website
curl https://pulsar.apache.org/charts/index.yaml --output index.yaml
# Replace the URLs from "https://downloads.apache.org" to "https://archive.apache.org"
# as the downloads.apache.org only contains latest releases.
sed -i 's|https://downloads.apache.org/pulsar/helm-chart/|https://archive.apache.org/dist/pulsar/helm-chart/|' index.yaml
# Generate / Merge the new version with existing index.yaml
helm repo index --merge ./index.yaml . --url "https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/${VERSION_RC}"
###### Generate index.yaml file - End
# Commit the artifacts
svn add *
svn commit -m "Add artifacts for Helm Chart ${VERSION_RC}"
```
- Remove old Helm Chart versions from the dev repo
First check if this is required by viewing the versions available at https://dist.apache.org/repos/dist/dev/pulsar/helm-chart
```shell
export PREVIOUS_VERSION_RC=3.0.0-candidate-1
svn rm --username $APACHE_USER -m "Remove old Helm Chart release: ${PREVIOUS_VERSION_RC}" https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/${PREVIOUS_VERSION_RC}
```
- Push Tag for the release candidate
```shell
cd ${PULSAR_REPO_ROOT}
git push origin tag pulsar-${VERSION_RC}
```
## Create release notes for the release candidate in GitHub UI
```shell
# open this URL and create release notes by clicking "Create release from tag"
echo https://github.com/apache/pulsar-helm-chart/releases/tag/pulsar-${VERSION_RC}
```
1. Open the above URL in a browser and create release notes by clicking "Create release from tag".
2. Find "Previous tag: auto" in the UI above the text box and choose the previous release there.
3. Click "Generate release notes".
4. Review the generated release notes.
5. Select "Set as a pre-release"
6. Click "Publish release".
## Prepare Vote email on the Apache Pulsar release candidate
- Send out a vote to the dev@pulsar.apache.org mailing list:
> [!TIP]
> The template output will get copied to the clipboard using pbpaste. On Linux, you can install xsel and add `alias pbcopy='xsel --clipboard --input'` to the shell.
Subject:
```shell
tee >(pbcopy) <<EOF
[VOTE] Release Apache Pulsar Helm Chart ${VERSION_WITHOUT_RC} based on ${VERSION_RC}
EOF
```
Body:
```shell
tee >(pbcopy) <<EOF
Hello Apache Pulsar Community,
This is a call for the vote to release the Apache Pulsar Helm Chart version ${VERSION_WITHOUT_RC}.
Release notes for $VERSION_RC:
https://github.com/apache/pulsar-helm-chart/releases/tag/pulsar-$VERSION_RC
The release candidate is available at:
https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/$VERSION_RC/
pulsar-chart-${VERSION_WITHOUT_RC}-source.tar.gz - is the "main source release".
pulsar-${VERSION_WITHOUT_RC}.tgz - is the binary Helm Chart release.
Public keys are available at: https://www.apache.org/dist/pulsar/KEYS
For convenience "index.yaml" has been uploaded (though excluded from voting), so you can also run the below commands.
helm repo add --force-update apache-pulsar-dist-dev \\
https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/$VERSION_RC/
helm repo update
helm install pulsar apache-pulsar-dist-dev/pulsar \\
--version ${VERSION_WITHOUT_RC} --set affinity.anti_affinity=false \\
--wait --timeout 10m --debug
For observing the deployment progress, you can use the k9s tool to view the cluster state changes in a different terminal window.
The k9s tool is available at https://k9scli.io/topics/install/.
pulsar-${VERSION_WITHOUT_RC}.tgz.prov - is also uploaded for verifying Chart Integrity, though it is not strictly required for releasing the artifact based on ASF Guidelines.
You can optionally verify this file using this helm plugin https://github.com/technosophos/helm-gpg, or by using helm --verify (https://helm.sh/docs/helm/helm_verify/).
helm fetch --prov apache-pulsar-dist-dev/pulsar
helm plugin install https://github.com/technosophos/helm-gpg
helm gpg verify pulsar-${VERSION_WITHOUT_RC}.tgz
The vote will be open for at least 72 hours.
Only votes from PMC members are binding, but members of the community are
encouraged to test the release and vote with "(non-binding)".
For license checks, the .rat-excludes files is included, so you can run the following to verify licenses (just update $PATH_TO_RAT):
tar -xvf pulsar-chart-${VERSION_WITHOUT_RC}-source.tar.gz
cd pulsar-chart-${VERSION_WITHOUT_RC}
java -jar $PATH_TO_RAT/apache-rat-0.15/apache-rat-0.15.jar . -E .rat-excludes
Please note that the version number excludes the \`-candidate-X\` string, so it's now
simply ${VERSION_WITHOUT_RC}. This will allow us to rename the artifact without modifying
the artifact checksums when we actually release it.
Thanks,
<your name>
EOF
```
Note, you need to update the `helm gpg verify` output and verify the end of the voting period in the body.
## Note about `helm gpg` vs `helm --verify`
Helm ships with a gpg verification tool, but it appears not to work with the currently used format for our KEYS file.
# Verify the release candidate by the PMC
The PMC should verify the releases in order to make sure the release is following the
[Apache Legal Release Policy](http://www.apache.org/legal/release-policy.html).
At least 3 (+1) votes from PMC members should be recorded in accordance to
[Votes on Package Releases](https://www.apache.org/foundation/voting.html#ReleaseVotes)
The legal checks include:
* checking if the packages are present in the right dist folder on svn
* verifying if all the sources have correct licences
* verifying if release manager signed the releases with the right key
* verifying if all the checksums are valid for the release
## SVN check
The files should be present in the sub-folder of
[Pulsar dist](https://dist.apache.org/repos/dist/dev/pulsar/helm-chart)
The following files should be present (7 files):
* `pulsar-chart-${VERSION_WITHOUT_RC}-source.tar.gz` + .asc + .sha512
* `pulsar-${VERSION_WITHOUT_RC}.tgz` + .asc + .sha512
* `pulsar-${VERSION_WITHOUT_RC}.tgz.prov`
As a PMC member you should be able to clone the SVN repository:
```shell
svn co https://dist.apache.org/repos/dist/dev/pulsar/helm-chart
```
Or update it if you already checked it out:
```shell
svn update .
```
## Licence check
This can be done with the Apache RAT tool.
* Download the latest jar from https://creadur.apache.org/rat/download_rat.cgi (unpack the binary,
the jar is inside)
* Unpack the release source archive (the `<package + version>-source.tar.gz` file) to a folder
* Enter the sources folder run the check
```shell
java -jar $PATH_TO_RAT/apache-rat-0.15/apache-rat-0.15.jar pulsar-chart-${VERSION_WITHOUT_RC} -E .rat-excludes
```
where `.rat-excludes` is the file in the root of git repo.
## Signature check
Make sure you have imported into your GPG the PGP key of the person signing the release. You can find the valid keys in
[KEYS](https://dist.apache.org/repos/dist/release/pulsar/KEYS).
You can import the whole KEYS file:
```shell script
gpg --import KEYS
```
You can also import the keys individually from a keyserver. The below one uses a key and
retrieves it from the default GPG keyserver
[OpenPGP.org](https://keys.openpgp.org):
```shell script
gpg --keyserver keys.openpgp.org --receive-keys <some_key>
```
You should choose to import the key when asked.
Note that by being default, the OpenPGP server tends to be overloaded often and might respond with
errors or timeouts. Many of the release managers also uploaded their keys to the
[GNUPG.net](https://keys.gnupg.net) keyserver, and you can retrieve it from there.
```shell script
gpg --keyserver keys.gnupg.net --receive-keys <some_key>
```
Once you have the keys, the signatures can be verified by running this:
```shell script
for i in *.asc
do
echo -e "Checking $i\n"; gpg --verify $i
done
```
This should produce results similar to the below. The "Good signature from ..." is indication
that the signatures are correct. Do not worry about the "not certified with a trusted signature"
warning. Most of the certificates used by release managers are self-signed, and that's why you get this
warning. By importing the key either from the server in the previous step or from the
[KEYS](https://dist.apache.org/repos/dist/release/pulsar/KEYS) page, you know that
this is a valid key already.
## SHA512 sum check
Run this:
```shell
for i in *.sha512
do
echo "Checking $i"; shasum -a 512 `basename $i .sha512 ` | diff - $i
done
```
You should get output similar to:
```
Checking pulsar-1.0.0.tgz.sha512
Checking pulsar-chart-1.0.0-source.tar.gz.sha512
```
# Verify release candidates by Contributors
Contributors can run below commands to test the Helm Chart
```shell
export VERSION_RC=3.0.0-candidate-1
export VERSION_WITHOUT_RC=${VERSION_RC%-candidate-*}
```
```shell
helm repo add --force-update \
apache-pulsar-dist-dev https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/$VERSION_RC/
helm repo update
helm install pulsar apache-pulsar-dist-dev/pulsar \
--version ${VERSION_WITHOUT_RC} --set affinity.anti_affinity=false
```
You can then perform any other verifications to check that it works as you expected by
upgrading the Chart or installing by overriding default of `values.yaml`.
# Publish the final release
## Summarize the voting for the release
Once the vote has been passed, you will need to send a result vote to [dev@pulsar.apache.org](mailto:dev@pulsar.apache.org):
Subject:
```shell
tee >(pbcopy) <<EOF
[RESULT][VOTE] Release Apache Pulsar Helm Chart ${VERSION_WITHOUT_RC} based on ${VERSION_RC}
EOF
```
Message:
```shell
tee >(pbcopy) <<EOF
Hello all,
The vote to release Apache Pulsar Helm Chart version ${VERSION_WITHOUT_RC} based on ${VERSION_RC} is now closed.
The vote PASSED with X binding "+1", Y non-binding "+1" and 0 "-1" votes:
"+1" Binding votes:
- <name>
"+1" Non-Binding votes:
- <name>
I'll continue with the release process and the release announcement will follow shortly.
Thanks,
<your name>
EOF
```
## Publish release to SVN
Set environment variables
```shell
export VERSION_RC=3.0.0-candidate-1
export VERSION_WITHOUT_RC=${VERSION_RC%-candidate-*}
export APACHE_USER=<your ASF userid>
```
Migrating the approved RC artifacts to the release directory:
https://dist.apache.org/repos/dist/release/pulsar/helm-chart/
svn commands for handling this:
```shell
svn rm --username $APACHE_USER -m "Remove temporary index.yaml file" https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/${VERSION_RC}/index.yaml
svn move --username $APACHE_USER -m "Release Pulsar Helm Chart ${VERSION_WITHOUT_RC} from ${VERSION_RC}" \
https://dist.apache.org/repos/dist/dev/pulsar/helm-chart/${VERSION_RC} \
https://dist.apache.org/repos/dist/release/pulsar/helm-chart/${VERSION_WITHOUT_RC}
```
Verify that the packages appear in [Pulsar Helm Chart](https://dist.apache.org/repos/dist/release/pulsar/helm-chart/).
## Publish release tag
Create and push the release tag:
```shell
git tag -u $APACHE_USER@apache.org pulsar-$VERSION_WITHOUT_RC $(git rev-parse pulsar-$VERSION_RC^{}) -m "Apache Pulsar Helm Chart ${VERSION_WITHOUT_RC}"
git push origin pulsar-${VERSION_WITHOUT_RC}
```
## Update index.yaml
The `index.yaml` file is the way helm users discover the binaries for the helm distribution. We currently host the
file at `pulsar.apache.org/charts/index.yaml`.
Then, run the following command from within `github.com/apache/pulsar-site` in the git repo.
```shell
# checkout pulsar-site
git clone https://github.com/apache/pulsar-site
cd pulsar-site
```
```shell
# Run on a branch based on main branch
cd static/charts
# need the chart file temporarily to update the index
wget https://dist.apache.org/repos/dist/release/pulsar/helm-chart/${VERSION_WITHOUT_RC}/pulsar-${VERSION_WITHOUT_RC}.tgz
# store the license header temporarily
head -n 17 index.yaml > license_header.txt
# update the index
helm repo index --merge ./index.yaml . --url "https://downloads.apache.org/pulsar/helm-chart/${VERSION_WITHOUT_RC}"
# restore the license header
mv index.yaml index.yaml.new
cat license_header.txt index.yaml.new > index.yaml
rm license_header.txt index.yaml.new
# remove the temp file
rm pulsar-${VERSION_WITHOUT_RC}.tgz
```
Verify that the updated `index.yaml` file has the most recent version.
Wait until the file is available:
```shell
while ! curl -fIL https://downloads.apache.org/pulsar/helm-chart/${VERSION_WITHOUT_RC}/pulsar-${VERSION_WITHOUT_RC}.tgz; do
echo "Waiting for pulsar-${VERSION_WITHOUT_RC}.tgz to become available..."
sleep 10
done
```
Then run:
```shell
git add index.yaml
git commit -m "Adding Pulsar Helm Chart ${VERSION_WITHOUT_RC} to index.yaml"
```
Then commit the change.
```
git push origin main
```
## Create release notes for the tag in GitHub UI
```shell
# open this URL and create release notes by clicking "Create release from tag"
echo https://github.com/apache/pulsar-helm-chart/releases/tag/pulsar-${VERSION_WITHOUT_RC}
```
1. Open the above URL in a browser and create release notes by clicking "Create release from tag".
2. Find "Previous tag: auto" in the UI above the text box and choose the previous release there.
3. Click "Generate release notes".
4. Review the generated release notes.
5. Click "Publish release".
## Notify developers of release
Once the `index.yaml` is live on the website, it is time to announce the release.
- Notify users@pulsar.apache.org (cc'ing dev@pulsar.apache.org) that
the artifacts have been published:
Subject:
```shell
tee >(pbcopy) <<EOF
[ANNOUNCE] Apache Pulsar Helm Chart version ${VERSION_WITHOUT_RC} Released
EOF
```
Body:
```shell
tee >(pbcopy) <<EOF
Dear community,
The Apache Pulsar team is pleased to announce the release of the Apache
Pulsar Helm Chart $VERSION_WITHOUT_RC.
The official source release, as well as the binary Helm Chart release,
are available at
https://downloads.apache.org/pulsar/helm-chart/$VERSION_WITHOUT_RC/.
The helm chart index at https://pulsar.apache.org/charts/ has been
updated and the release is also available directly via helm.
Release Notes:
https://github.com/apache/pulsar-helm-chart/releases/tag/pulsar-$VERSION_WITHOUT_RC
Docs: https://github.com/apache/pulsar-helm-chart#readme and https://pulsar.apache.org/docs/helm-overview
ArtifactHub: https://artifacthub.io/packages/helm/apache/pulsar/$VERSION_WITHOUT_RC
Thanks to all the contributors who made this possible.
Regards,
The Apache Pulsar Team
EOF
```
Send the same email to announce@apache.org.
It is more reliable to send it via the web ui at https://lists.apache.org/list.html?announce@apache.org
(press "c" to compose a new thread).
## Create release on GitHub
Create a new release on GitHub with the release notes and assets from the release svn.
## Close the milestone
Close the milestone on GitHub. Create the next one if it hasn't been already.
## Announce the release on the community slack
Post this in the #announce channel:
```shell
tee >(pbcopy) <<EOF
We've just released Apache Pulsar Helm Chart ${VERSION_WITHOUT_RC} 🎉
The official source release, as well as the binary Helm Chart release,
are available at
https://downloads.apache.org/pulsar/helm-chart/$VERSION_WITHOUT_RC/.
The helm chart index at https://pulsar.apache.org/charts/ has been
updated and the release is also available directly via helm.
Release Notes:
https://github.com/apache/pulsar-helm-chart/releases/tag/pulsar-$VERSION_WITHOUT_RC
Docs: https://github.com/apache/pulsar-helm-chart#readme and https://pulsar.apache.org/docs/helm-overview
ArtifactHub: https://artifacthub.io/packages/helm/apache/pulsar/$VERSION_WITHOUT_RC
Thanks to all the contributors who made this possible.
EOF
```
## Maintaining svn https://dist.apache.org/repos/dist/release/pulsar/helm-chart/ content
The chart references the files in https://downloads.apache.org/pulsar/helm-chart/ which are maintained
by SVN directory https://dist.apache.org/repos/dist/release/pulsar/helm-chart/.
If you remove releases from this directory, the URLs in index.yaml should be updated point to the
https://archive.apache.org/dist/pulsar/helm-chart/ URL base instead of https://downloads.apache.org/pulsar/helm-chart/.

53
Vagrantfile vendored Normal file
View File

@ -0,0 +1,53 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# -*- mode: ruby -*-
# vi: set ft=ruby :
# vagrant configuration file for setting up local environment for Pulsar Helm Chart
# CI script development.
#
# usage:
# Starting vagrant box:
# vagrant up
# Connecting to vagrant box and running a ci script:
# vagrant ssh
# byobu
# cd /vagrant
# .ci/chart_test.sh .ci/clusters/values-local-pv.yaml
# Shutting down vagrant box:
# vagrant halt
# Destroying vagrant box:
# vagrant destroy
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
config.vm.provider "virtualbox" do |vb|
vb.memory = "7168"
vb.cpus = 2
end
config.vm.provision "shell", inline: <<-SHELL
export DEBIAN_FRONTEND=noninteractive
sudo apt-get update
sudo apt-get -y install docker.io
sudo adduser vagrant docker
echo 'PATH="/vagrant/output/bin:$PATH"' >> /home/vagrant/.profile
SHELL
end

View File

@ -1,3 +1,20 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.

View File

@ -17,15 +17,22 @@
# under the License.
#
apiVersion: v1
appVersion: "2.7.2"
apiVersion: v2
appVersion: "4.0.5"
description: Apache Pulsar Helm chart for Kubernetes
name: pulsar
version: 2.7.5
version: 4.1.0
kubeVersion: ">=1.25.0-0"
home: https://pulsar.apache.org
sources:
- https://github.com/apache/pulsar
icon: http://pulsar.apache.org/img/pulsar.svg
- https://github.com/apache/pulsar
- https://github.com/apache/pulsar-helm-chart
icon: https://pulsar.apache.org/img/pulsar.svg
maintainers:
- name: The Apache Pulsar Team
email: dev@pulsar.apache.org
- name: The Apache Pulsar Team
email: dev@pulsar.apache.org
dependencies:
- name: victoria-metrics-k8s-stack
version: 0.38.x
repository: https://victoriametrics.github.io/helm-charts/
condition: victoria-metrics-k8s-stack.enabled

239
charts/pulsar/LICENSE Normal file
View File

@ -0,0 +1,239 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
----------------------------------------------------------------------------------------------------
pulsar-common/src/main/java/org/apache/pulsar/common/util/protobuf/ByteBufCoded{Input,Output}Stream.java
Copyright 2014, Google Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Code generated by the Protocol Buffer compiler is owned by the owner
of the input file used when generating it. This code is not
standalone and requires a support library to be linked with it. This
support library is itself covered by the above license.

5
charts/pulsar/NOTICE Normal file
View File

@ -0,0 +1,5 @@
Apache Pulsar
Copyright 2017-2022 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

View File

@ -0,0 +1,185 @@
======================================================================================
APACHE PULSAR HELM CHART
======================================================================================
======================================================================================
SECURITY ADVISORY
======================================================================================
This Helm chart's default configuration DOES NOT meet production security requirements.
Users MUST review and customize security settings for their specific environment.
IMPORTANT: This Helm chart provides a starting point for Pulsar deployments but requires
significant security customization before use in production environments. We strongly
recommend implementing:
1. Proper network isolation and access controls
2. Authentication and authorization for all components
3. TLS encryption for all communication channels
4. Regular security updates and vulnerability assessments
As an open source project, we welcome contributions to improve security features.
Please consider submitting pull requests to address security gaps or enhance
existing security implementations.
---------------------------------------------------------------------------------------
SECURITY NOTICE: The Pulsar proxy is not designed for direct public internet exposure.
It lacks security features required for untrusted networks and should only be deployed
within secured environments with proper network controls.
IMPORTANT CHANGE IN v4.0.0: Default service type changed from LoadBalancer to ClusterIP
for security reasons. This limits access to within the Kubernetes environment by default.
---------------------------------------------------------------------------------------
IF YOU NEED EXTERNAL ACCESS FOR YOUR PULSAR CLUSTER:
---------------------------------------------------------------------------------------
Note: This information might be outdated. Please go to https://github.com/apache/pulsar-helm-chart for updated information.
If you need to expose the Pulsar Proxy outside the cluster using a LoadBalancer service type:
1. USE INTERNAL LOAD BALANCERS ONLY
- Set type to LoadBalancer only in secured environments with proper network controls
- Add cloud provider-specific annotations for internal load balancers
- See cloud provider documentation:
* AWS / EKS: https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/
* Azure / AKS: https://learn.microsoft.com/en-us/azure/aks/internal-lb
* GCP / GKE: https://cloud.google.com/kubernetes-engine/docs/concepts/service-load-balancer-parameters
- Examples (verify correctness for your environment):
* AWS / EKS: service.beta.kubernetes.io/aws-load-balancer-internal: "true"
* Azure / AKS: service.beta.kubernetes.io/azure-load-balancer-internal: "true"
* GCP / GKE: networking.gke.io/load-balancer-type: "Internal"
2. IMPLEMENT AUTHENTICATION AND AUTHORIZATION
- Configure all clients to authenticate properly
- Set up appropriate authorization policies
3. USE TLS FOR ALL CONNECTIONS
- Enable TLS for client-to-proxy connections
- Enable TLS for proxy-to-broker connections
- Enable TLS for all internal cluster communications (brokers, zookeepers, bookies)
- Note: TLS alone is NOT sufficient as a security solution in Pulsar. Even with TLS enabled,
clusters exposed to untrusted networks remain vulnerable to denial-of-service attacks,
authentication bypass attempts, and protocol-level exploits. Always implement defense-in-depth
security measures and limit exposure to trusted networks only.
4. NETWORK SECURITY
- Use private networks (VPCs)
- Configure firewalls, security groups, and IP restrictions appropriately
- In addition, consider using loadBalancerSourceRanges to limit access to specific IP ranges
5. CLIENT IP ADDRESS BASED ACCESS RESTRICTIONS
- When using a LoadBalancer service type, restrict access to specific IP ranges by configuring
`proxy.service.loadBalancerSourceRanges` in your values.yaml
- Important: This should be implemented alongside other security measures (internal load balancer,
authentication, TLS, network policies) as part of a defense-in-depth strategy,
not as a standalone security solution
---------------------------------------------------------------------------------------
ALTERNATIVE FOR EXTERNAL ACCESS
---------------------------------------------------------------------------------------
As an alternative method for external access, Pulsar has support for SNI proxy routing:
https://pulsar.apache.org/docs/next/concepts-proxy-sni-routing/
SNI Proxy routing is supported with proxy servers such as Apache Traffic Server, HAProxy and Nginx.
Note: This option isn't currently implemented in the Apache Pulsar Helm chart.
IMPORTANT: Pulsar binary protocol cannot be exposed outside of the Kubernetes cluster
using Kubernetes Ingress. Kubernetes Ingress works for the Admin REST API and topic lookups,
but clients would be connecting to the advertised listener addresses returned by the brokers and it
would only work when clients can connect directly to brokers. This is not a supported secure option
for exposing Pulsar to untrusted networks.
{{- if .Values.useReleaseStatus }}
======================================================================================
🚀 QUICK START 🚀
======================================================================================
Watching events to view progress of deployment:
kubectl get -n {{ .Values.namespace | default .Release.Namespace }} events -o wide --watch
Watching state of deployed Kubernetes objects, updated every 2 seconds:
watch kubectl get -n {{ .Values.namespace | default .Release.Namespace }} all
{{- if .Values.components.proxy }}
Waiting until Pulsar Proxy is available:
kubectl wait --timeout=600s --for=condition=ready pod -n {{ .Values.namespace | default .Release.Namespace }} -l component=proxy
{{- end }}
Watching state with k9s (https://k9scli.io/topics/install/):
k9s -n {{ .Values.namespace | default .Release.Namespace }}
{{- if and .Values.affinity.anti_affinity (or (gt (int .Values.bookkeeper.replicaCount) 1) (gt (int .Values.zookeeper.replicaCount) 1)) }}
======================================================================================
⚠️ NOTICE FOR DEV K8S CLUSTER USERS ⚠️
======================================================================================
Please note that anti-affinity rules for Zookeeper and Bookie components require at least
one node per replica. There are currently {{ .Values.bookkeeper.replicaCount }} bookies and {{ .Values.zookeeper.replicaCount }} zookeepers configured.
For Kubernetes clusters with fewer than 3 nodes, such as single-node Kubernetes clusters in
development environments like minikube, Docker Desktop, Rancher Desktop (k3s), or Podman
Desktop, you must disable the anti-affinity feature by either:
Adding to your values.yaml:
affinity:
anti_affinity: false
Or adding "--set affinity.anti_affinity=false" to the helm command line.
After making the changes to your values yaml file, redeploy with "helm upgrade":
helm upgrade -n {{ .Release.Namespace }} -f your_values_file.yaml {{ .Release.Name }} apachepulsar/pulsar
These configuration instructions can be omitted for Kubernetes clusters with 3 or more nodes.
{{- end }}
{{- end }}
{{- if and (eq .Values.proxy.service.type "LoadBalancer") (not .Values.proxy.service.annotations) }}
======================================================================================
⚠️ 🚨 INSECURE CONFIGURATION DETECTED 🚨 ⚠️
======================================================================================
WARNING: You are using a LoadBalancer service type without internal load balancer
annotations. This is potentially an insecure configuration. Please carefully review
the security recommendations above and visit https://github.com/apache/pulsar-helm-chart
for more information.
======================================================================================
{{- end }}
======================================================================================
DISCLAIMER
======================================================================================
The providers of this Helm chart make no guarantees regarding the security of the chart under
any circumstances. It is the user's responsibility to ensure that their deployment is secure
and complies with all relevant security standards and regulations.
By using this Helm chart, the user acknowledges the risks associated with its default
configuration and the necessity for proper security customization. The user further
agrees that the providers of the Helm chart shall not be liable for any security breaches
or incidents resulting from the use of the chart.
The user assumes full responsibility for the security and integrity of their deployment.
This includes, but is not limited to, the proper configuration of security features and
adherence to best practices for securing network access. The providers of this Helm chart
disclaim all warranties, whether express or implied, including any warranties of
merchantability, fitness for a particular purpose, and non-infringement of third-party rights.
======================================================================================
RESOURCES
======================================================================================
- 🖥️ Install k9s terminal interface for viewing and managing k8s clusters: https://k9scli.io/topics/install/
- ❓ Usage Questions: https://github.com/apache/pulsar/discussions/categories/q-a
- 🐛 Report Issues: https://github.com/apache/pulsar-helm-chart/issues
- 🔒 Security Issues: https://pulsar.apache.org/security/
- 📚 Documentation: https://github.com/apache/pulsar-helm-chart
🌟 Please contribute to improve the Apache Pulsar Helm chart and its documentation:
- 🤝 Contribute: https://github.com/apache/pulsar-helm-chart
Thank you for installing Apache Pulsar Helm chart version {{ .Chart.Version }}.

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define the pulsar autorecovery service
*/}}
@ -17,7 +36,7 @@ Define autorecovery zookeeper client tls settings
*/}}
{{- define "pulsar.autorecovery.zookeeper.tls.settings" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
/pulsar/keytool/keytool.sh autorecovery {{ template "pulsar.autorecovery.hostname" . }} true;
{{- include "pulsar.component.zookeeper.tls.settings" (dict "component" "autorecovery" "isClient" true "isCacerts" .Values.tls.autorecovery.cacerts.enabled) -}}
{{- end }}
{{- end }}
@ -32,11 +51,21 @@ Define autorecovery tls certs mounts
- name: ca
mountPath: "/pulsar/certs/ca"
readOnly: true
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
mountPath: "/pulsar/keytool/keytool.sh"
subPath: keytool.sh
{{- end }}
{{- if .Values.tls.autorecovery.cacerts.enabled }}
- mountPath: "/pulsar/certs/cacerts"
name: autorecovery-cacerts
{{- range $cert := .Values.tls.autorecovery.cacerts.certs }}
- name: {{ $cert.name }}
mountPath: "/pulsar/certs/{{ $cert.name }}"
readOnly: true
{{- end }}
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem.sh"
subPath: certs-combine-pem.sh
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem-infinity.sh"
subPath: certs-combine-pem-infinity.sh
{{- end }}
{{- end }}
@ -53,18 +82,32 @@ Define autorecovery tls certs volumes
path: tls.crt
- key: tls.key
path: tls.key
- key: tls-combined.pem
path: tls-combined.pem
- name: ca
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.ca_suffix }}"
secretName: "{{ template "pulsar.certs.issuers.ca.secretName" . }}"
items:
- key: ca.crt
path: ca.crt
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
configMap:
name: "{{ template "pulsar.fullname" . }}-keytool-configmap"
defaultMode: 0755
{{- end }}
{{- if .Values.tls.autorecovery.cacerts.enabled }}
- name: autorecovery-cacerts
emptyDir: {}
{{- range $cert := .Values.tls.autorecovery.cacerts.certs }}
- name: {{ $cert.name }}
secret:
secretName: "{{ $cert.existingSecret }}"
items:
{{- range $key := $cert.secretKeys }}
- key: {{ $key }}
path: {{ $key }}
{{- end }}
{{- end }}
- name: certs-scripts
configMap:
name: "{{ template "pulsar.fullname" . }}-certs-scripts"
defaultMode: 0755
{{- end }}
{{- end }}
@ -73,8 +116,9 @@ Define autorecovery init container : verify cluster id
*/}}
{{- define "pulsar.autorecovery.init.verify_cluster_id" -}}
bin/apply-config-from-env.py conf/bookkeeper.conf;
{{- include "pulsar.autorecovery.zookeeper.tls.settings" . -}}
until bin/bookkeeper shell whatisinstanceid; do
export BOOKIE_MEM="-Xmx128M";
{{- include "pulsar.autorecovery.zookeeper.tls.settings" . }}
until timeout 15 bin/bookkeeper shell whatisinstanceid; do
sleep 3;
done;
{{- end }}

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define the pulsar bookkeeper service
*/}}
@ -18,7 +37,7 @@ Define bookie zookeeper client tls settings
*/}}
{{- define "pulsar.bookkeeper.zookeeper.tls.settings" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
/pulsar/keytool/keytool.sh bookie {{ template "pulsar.bookkeeper.hostname" . }} true;
{{- include "pulsar.component.zookeeper.tls.settings" (dict "component" "bookie" "isClient" true "isCacerts" .Values.tls.bookie.cacerts.enabled) -}}
{{- end }}
{{- end }}
@ -26,18 +45,30 @@ Define bookie zookeeper client tls settings
Define bookie tls certs mounts
*/}}
{{- define "pulsar.bookkeeper.certs.volumeMounts" -}}
{{- if and .Values.tls.enabled (or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled) }}
{{- if .Values.tls.enabled }}
{{- if or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled }}
- name: bookie-certs
mountPath: "/pulsar/certs/bookie"
readOnly: true
{{- end }}
- name: ca
mountPath: "/pulsar/certs/ca"
readOnly: true
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
mountPath: "/pulsar/keytool/keytool.sh"
subPath: keytool.sh
{{- end }}
{{- if .Values.tls.bookie.cacerts.enabled }}
- mountPath: "/pulsar/certs/cacerts"
name: bookie-cacerts
{{- range $cert := .Values.tls.bookie.cacerts.certs }}
- name: {{ $cert.name }}
mountPath: "/pulsar/certs/{{ $cert.name }}"
readOnly: true
{{- end }}
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem.sh"
subPath: certs-combine-pem.sh
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem-infinity.sh"
subPath: certs-combine-pem-infinity.sh
{{- end }}
{{- end }}
@ -45,7 +76,8 @@ Define bookie tls certs mounts
Define bookie tls certs volumes
*/}}
{{- define "pulsar.bookkeeper.certs.volumes" -}}
{{- if and .Values.tls.enabled (or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled) }}
{{- if .Values.tls.enabled }}
{{- if or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled }}
- name: bookie-certs
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.bookie.cert_name }}"
@ -54,18 +86,35 @@ Define bookie tls certs volumes
path: tls.crt
- key: tls.key
path: tls.key
{{- if .Values.tls.zookeeper.enabled }}
- key: tls-combined.pem
path: tls-combined.pem
{{- end }}
{{- end }}
- name: ca
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.ca_suffix }}"
secretName: "{{ template "pulsar.certs.issuers.ca.secretName" . }}"
items:
- key: ca.crt
path: ca.crt
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
configMap:
name: "{{ template "pulsar.fullname" . }}-keytool-configmap"
defaultMode: 0755
{{- end }}
{{- if .Values.tls.bookie.cacerts.enabled }}
- name: bookie-cacerts
emptyDir: {}
{{- range $cert := .Values.tls.bookie.cacerts.certs }}
- name: {{ $cert.name }}
secret:
secretName: "{{ $cert.existingSecret }}"
items:
{{- range $key := $cert.secretKeys }}
- key: {{ $key }}
path: {{ $key }}
{{- end }}
{{- end }}
- name: certs-scripts
configMap:
name: "{{ template "pulsar.fullname" . }}-certs-scripts"
defaultMode: 0755
{{- end }}
{{- end }}
@ -73,8 +122,31 @@ Define bookie tls certs volumes
Define bookie common config
*/}}
{{- define "pulsar.bookkeeper.config.common" -}}
zkServers: "{{ template "pulsar.zookeeper.connect" . }}"
zkLedgersRootPath: "{{ .Values.metadataPrefix }}/ledgers"
{{/*
Configure BookKeeper's metadata store (available since BookKeeper 4.7.0 / BP-29)
https://bookkeeper.apache.org/bps/BP-29-metadata-store-api-module/
https://bookkeeper.apache.org/docs/deployment/manual#cluster-metadata-setup
*/}}
# Set empty values for zkServers and zkLedgersRootPath since we're using the metadataServiceUri to configure BookKeeper's metadata store
zkServers: ""
zkLedgersRootPath: ""
{{- if .Values.components.zookeeper }}
{{- if (and (hasKey .Values.pulsar_metadata "bookkeeper") .Values.pulsar_metadata.bookkeeper.usePulsarMetadataBookieDriver) }}
# there's a bug when using PulsarMetadataBookieDriver since it always appends /ledgers to the metadataServiceUri
# Possibly a bug in org.apache.pulsar.metadata.bookkeeper.AbstractMetadataDriver#resolveLedgersRootPath in Pulsar code base
metadataServiceUri: "metadata-store:zk:{{ template "pulsar.zookeeper.connect" . }}{{ .Values.metadataPrefix }}"
{{- else }}
# use zk+hierarchical:// when using BookKeeper's built-in metadata driver
metadataServiceUri: "zk+hierarchical://{{ template "pulsar.zookeeper.connect" . }}{{ .Values.metadataPrefix }}/ledgers"
{{- end }}
{{- else if .Values.components.oxia }}
metadataServiceUri: "{{ template "pulsar.oxia.metadata.url.bookkeeper" . }}"
{{- end }}
{{- /* metadataStoreSessionTimeoutMillis maps to zkTimeout in bookkeeper.conf for both zookeeper and oxia metadata stores */}}
{{- if (and (hasKey .Values.pulsar_metadata "bookkeeper") (hasKey .Values.pulsar_metadata.bookkeeper "metadataStoreSessionTimeoutMillis")) }}
zkTimeout: "{{ .Values.pulsar_metadata.bookkeeper.metadataStoreSessionTimeoutMillis }}"
{{- end }}
# enable bookkeeper http server
httpServerEnabled: "true"
httpServerPort: "{{ .Values.bookkeeper.ports.http }}"
@ -94,7 +166,7 @@ PULSAR_PREFIX_tlsCertificatePath: /pulsar/certs/bookie/tls.crt
PULSAR_PREFIX_tlsKeyStoreType: PEM
PULSAR_PREFIX_tlsKeyStore: /pulsar/certs/bookie/tls.key
PULSAR_PREFIX_tlsTrustStoreType: PEM
PULSAR_PREFIX_tlsTrustStore: /pulsar/certs/ca/ca.crt
PULSAR_PREFIX_tlsTrustStore: {{ ternary "/pulsar/certs/cacerts/ca-combined.pem" "/pulsar/certs/ca/ca.crt" .Values.tls.bookie.cacerts.enabled | quote }}
{{- end }}
{{- end }}
@ -104,8 +176,9 @@ Define bookie init container : verify cluster id
{{- define "pulsar.bookkeeper.init.verify_cluster_id" -}}
{{- if not (and .Values.volumes.persistence .Values.bookkeeper.volumes.persistence) }}
bin/apply-config-from-env.py conf/bookkeeper.conf;
{{- include "pulsar.bookkeeper.zookeeper.tls.settings" . -}}
until bin/bookkeeper shell whatisinstanceid; do
export BOOKIE_MEM="-Xmx128M";
{{- include "pulsar.bookkeeper.zookeeper.tls.settings" . }}
until timeout 15 bin/bookkeeper shell whatisinstanceid; do
sleep 3;
done;
bin/bookkeeper shell bookieformat -nonInteractive -force -deleteCookie || true
@ -113,8 +186,9 @@ bin/bookkeeper shell bookieformat -nonInteractive -force -deleteCookie || true
{{- if and .Values.volumes.persistence .Values.bookkeeper.volumes.persistence }}
set -e;
bin/apply-config-from-env.py conf/bookkeeper.conf;
{{- include "pulsar.bookkeeper.zookeeper.tls.settings" . -}}
until bin/bookkeeper shell whatisinstanceid; do
export BOOKIE_MEM="-Xmx128M";
{{- include "pulsar.bookkeeper.zookeeper.tls.settings" . }}
until timeout 15 bin/bookkeeper shell whatisinstanceid; do
sleep 3;
done;
{{- end }}

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define the pulsar brroker service
*/}}
@ -24,7 +43,7 @@ Define broker zookeeper client tls settings
*/}}
{{- define "pulsar.broker.zookeeper.tls.settings" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
/pulsar/keytool/keytool.sh broker {{ template "pulsar.broker.hostname" . }} true;
{{- include "pulsar.component.zookeeper.tls.settings" (dict "component" "broker" "isClient" true "isCacerts" .Values.tls.broker.cacerts.enabled) -}}
{{- end }}
{{- end }}
@ -32,18 +51,30 @@ Define broker zookeeper client tls settings
Define broker tls certs mounts
*/}}
{{- define "pulsar.broker.certs.volumeMounts" -}}
{{- if and .Values.tls.enabled (or .Values.tls.broker.enabled (or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled)) }}
{{- if .Values.tls.enabled }}
{{- if or .Values.tls.broker.enabled (or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled) }}
- name: broker-certs
mountPath: "/pulsar/certs/broker"
readOnly: true
{{- end }}
- name: ca
mountPath: "/pulsar/certs/ca"
readOnly: true
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
mountPath: "/pulsar/keytool/keytool.sh"
subPath: keytool.sh
{{- end }}
{{- if .Values.tls.broker.cacerts.enabled }}
- mountPath: "/pulsar/certs/cacerts"
name: broker-cacerts
{{- range $cert := .Values.tls.broker.cacerts.certs }}
- name: {{ $cert.name }}
mountPath: "/pulsar/certs/{{ $cert.name }}"
readOnly: true
{{- end }}
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem.sh"
subPath: certs-combine-pem.sh
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem-infinity.sh"
subPath: certs-combine-pem-infinity.sh
{{- end }}
{{- end }}
@ -51,7 +82,8 @@ Define broker tls certs mounts
Define broker tls certs volumes
*/}}
{{- define "pulsar.broker.certs.volumes" -}}
{{- if and .Values.tls.enabled (or .Values.tls.broker.enabled (or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled)) }}
{{- if .Values.tls.enabled }}
{{- if or .Values.tls.broker.enabled (or .Values.tls.bookie.enabled .Values.tls.zookeeper.enabled) }}
- name: broker-certs
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.broker.cert_name }}"
@ -60,17 +92,34 @@ Define broker tls certs volumes
path: tls.crt
- key: tls.key
path: tls.key
{{- if .Values.tls.zookeeper.enabled }}
- key: tls-combined.pem
path: tls-combined.pem
{{- end }}
{{- end }}
- name: ca
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.ca_suffix }}"
secretName: "{{ template "pulsar.certs.issuers.ca.secretName" . }}"
items:
- key: ca.crt
path: ca.crt
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
{{- end }}
{{- if .Values.tls.broker.cacerts.enabled }}
- name: broker-cacerts
emptyDir: {}
{{- range $cert := .Values.tls.broker.cacerts.certs }}
- name: {{ $cert.name }}
secret:
secretName: "{{ $cert.existingSecret }}"
items:
{{- range $key := $cert.secretKeys }}
- key: {{ $key }}
path: {{ $key }}
{{- end }}
{{- end }}
- name: certs-scripts
configMap:
name: "{{ template "pulsar.fullname" . }}-keytool-configmap"
name: "{{ template "pulsar.fullname" . }}-certs-scripts"
defaultMode: 0755
{{- end }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,132 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define the pulsar certs ca issuer name
*/}}
{{- define "pulsar.certs.issuers.ca.name" -}}
{{- if .Values.certs.internal_issuer.enabled -}}
{{- if and (eq .Values.certs.internal_issuer.type "selfsigning") .Values.certs.issuers.selfsigning.name -}}
{{- .Values.certs.issuers.selfsigning.name -}}
{{- else if and (eq .Values.certs.internal_issuer.type "ca") .Values.certs.issuers.ca.name -}}
{{- .Values.certs.issuers.ca.name -}}
{{- else -}}
{{- template "pulsar.fullname" . }}-{{ .Values.certs.internal_issuer.component }}-ca-issuer
{{- end -}}
{{- else -}}
{{- if .Values.certs.issuers.ca.name -}}
{{- .Values.certs.issuers.ca.name -}}
{{- else -}}
{{- fail "certs.issuers.ca.name is required when TLS is enabled and certs.internal_issuer.enabled is false" -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{/*
Define the pulsar certs ca issuer secret name
*/}}
{{- define "pulsar.certs.issuers.ca.secretName" -}}
{{- if .Values.certs.internal_issuer.enabled -}}
{{- if and (eq .Values.certs.internal_issuer.type "selfsigning") .Values.certs.issuers.selfsigning.secretName -}}
{{- .Values.certs.issuers.selfsigning.secretName -}}
{{- else if and (eq .Values.certs.internal_issuer.type "ca") .Values.certs.issuers.ca.secretName -}}
{{- .Values.certs.issuers.ca.secretName -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name .Values.tls.ca_suffix -}}
{{- end -}}
{{- else -}}
{{- if .Values.certs.issuers.ca.secretName -}}
{{- .Values.certs.issuers.ca.secretName -}}
{{- else -}}
{{- fail "certs.issuers.ca.secretName is required when TLS is enabled and certs.internal_issuer.enabled is false" -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{/*
Common certificate template
Usage: {{- include "pulsar.cert.template" (dict "root" . "componentConfig" .Values.proxy "tlsConfig" .Values.tls.proxy) -}}
*/}}
{{- define "pulsar.cert.template" -}}
{{- if eq .root.Values.certs.internal_issuer.apiVersion "cert-manager.io/v1beta1" -}}
{{- fail "cert-manager.io/v1beta1 is no longer supported. Please set certs.internal_issuer.apiVersion to cert-manager.io/v1" -}}
{{- end -}}
apiVersion: "{{ .root.Values.certs.internal_issuer.apiVersion }}"
kind: Certificate
metadata:
name: "{{ template "pulsar.fullname" .root }}-{{ .tlsConfig.cert_name }}"
namespace: {{ template "pulsar.namespace" .root }}
labels:
{{- include "pulsar.standardLabels" .root | nindent 4 }}
spec:
# Secret names are always required.
secretName: "{{ .root.Release.Name }}-{{ .tlsConfig.cert_name }}"
{{- if .root.Values.tls.zookeeper.enabled }}
additionalOutputFormats:
- type: CombinedPEM
{{- end }}
duration: "{{ .root.Values.tls.common.duration }}"
renewBefore: "{{ .root.Values.tls.common.renewBefore }}"
subject:
organizations:
{{ toYaml .root.Values.tls.common.organization | indent 4 }}
# The use of the common name field has been deprecated since 2000 and is
# discouraged from being used.
commonName: "{{ template "pulsar.fullname" .root }}-{{ .componentConfig.component }}"
isCA: false
privateKey:
size: {{ .root.Values.tls.common.keySize }}
algorithm: {{ .root.Values.tls.common.keyAlgorithm }}
encoding: {{ .root.Values.tls.common.keyEncoding }}
usages:
- server auth
- client auth
# At least one of a DNS Name, USI SAN, or IP address is required.
dnsNames:
{{- if .tlsConfig.dnsNames }}
{{ toYaml .tlsConfig.dnsNames | indent 4 }}
{{- end }}
- {{ printf "*.%s-%s.%s.svc.%s" (include "pulsar.fullname" .root) .componentConfig.component (include "pulsar.namespace" .root) .root.Values.clusterDomain | quote }}
- {{ printf "%s-%s" (include "pulsar.fullname" .root) .componentConfig.component | quote }}
# Issuer references are always required.
issuerRef:
name: "{{ template "pulsar.certs.issuers.ca.name" .root }}"
# We can reference ClusterIssuers by changing the kind here.
# The default value is Issuer (i.e. a locally namespaced Issuer)
kind: Issuer
# This is optional since cert-manager will default to this value however
# if you are using an external issuer, change this to that issuer group.
group: cert-manager.io
{{- end -}}
{{/*
CA certificates template
Usage: {{ include "pulsar.certs.cacerts" (dict "certs" .Values.tls.<component>.cacerts.certs) }}
*/}}
{{- define "pulsar.certs.cacerts" -}}
{{- $certs := .certs -}}
{{- $cacerts := list -}}
{{- $cacerts = print "/pulsar/certs/ca/ca.crt" | append $cacerts -}}
{{- range $cert := $certs -}}
{{- range $key := $cert.secretKeys -}}
{{- $cacerts = print "/pulsar/certs/" $cert.name "/" $key | append $cacerts -}}
{{- end -}}
{{- end -}}
{{ join " " $cacerts }}
{{- end -}}

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define configuration store endpoint
*/}}

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/* vim: set filetype=mustache: */}}
{{/*
@ -66,6 +85,9 @@ chart: {{ template "pulsar.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
cluster: {{ template "pulsar.cluster.name" . }}
{{- if .Values.labels }}
{{ .Values.labels | toYaml | trim }}
{{- end }}
{{- end }}
{{/*
@ -75,6 +97,9 @@ Create the template labels.
app: {{ template "pulsar.name" . }}
release: {{ .Release.Name }}
cluster: {{ template "pulsar.cluster.name" . }}
{{- if .Values.labels }}
{{ .Values.labels | toYaml | trim }}
{{- end }}
{{- end }}
{{/*
@ -96,3 +121,18 @@ imagePullSecrets:
{{- end }}
{{- end -}}
{{- end }}
{{/*
Create full image name
*/}}
{{- define "pulsar.imageFullName" -}}
{{- printf "%s:%s" (.image.repository | default .root.Values.defaultPulsarImageRepository) (.image.tag | default .root.Values.defaultPulsarImageTag | default .root.Chart.AppVersion) -}}
{{- end -}}
{{/*
Lookup pull policy, default to defaultPullPolicy
*/}}
{{- define "pulsar.imagePullPolicy" -}}
{{- printf "%s" (.image.pullPolicy | default .root.Values.defaultPullPolicy) -}}
{{- end -}}

View File

@ -0,0 +1,97 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{- define "pulsar.podMonitor" -}}
{{- $root := index . 0 }}
{{- $component := index . 1 }}
{{- $matchLabel := index . 2 }}
{{- $portName := "http" }}
{{- if gt (len .) 3 }}
{{- $portName = index . 3 }}
{{- end }}
{{/* Extract component parts for nested values */}}
{{- $componentParts := splitList "." $component }}
{{- $valuesPath := $root.Values }}
{{- range $componentParts }}
{{- $valuesPath = index $valuesPath . }}
{{- end }}
{{- if index $root.Values "victoria-metrics-k8s-stack" "enabled" }}
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
{{- else }}
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
{{- end }}
metadata:
name: {{ template "pulsar.fullname" $root }}-{{ replace "." "-" $component }}
labels:
{{- include "pulsar.standardLabels" $root | nindent 4 }}
spec:
jobLabel: {{ replace "." "-" $component }}
podMetricsEndpoints:
- port: {{ $portName }}
path: /metrics
scheme: http
interval: {{ $valuesPath.podMonitor.interval }}
scrapeTimeout: {{ $valuesPath.podMonitor.scrapeTimeout }}
# Set honor labels to true to allow overriding namespace label with Pulsar's namespace label
honorLabels: true
{{- if index $root.Values "victoria-metrics-k8s-stack" "enabled" }}
relabelConfigs:
{{- else }}
relabelings:
{{- end }}
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- sourceLabels: [__meta_kubernetes_namespace]
action: replace
targetLabel: kubernetes_namespace
- sourceLabels: [__meta_kubernetes_pod_label_component]
action: replace
targetLabel: job
- sourceLabels: [__meta_kubernetes_pod_name]
action: replace
targetLabel: kubernetes_pod_name
{{- if or $valuesPath.podMonitor.metricRelabelings (and $valuesPath.podMonitor.dropUnderscoreCreatedMetrics (index $valuesPath.podMonitor.dropUnderscoreCreatedMetrics "enabled")) }}
{{- if index $root.Values "victoria-metrics-k8s-stack" "enabled" }}
metricRelabelConfigs:
{{- else }}
metricRelabelings:
{{- end }}
{{- if and $valuesPath.podMonitor.dropUnderscoreCreatedMetrics (index $valuesPath.podMonitor.dropUnderscoreCreatedMetrics "enabled") }}
# Drop metrics that end with _created, auto-created by metrics library to match OpenMetrics format
- sourceLabels: [__name__]
{{- if and (hasKey $valuesPath.podMonitor.dropUnderscoreCreatedMetrics "excludePatterns") $valuesPath.podMonitor.dropUnderscoreCreatedMetrics.excludePatterns }}
regex: "(?!{{ $valuesPath.podMonitor.dropUnderscoreCreatedMetrics.excludePatterns | join "|" }}).*_created$"
{{- else }}
regex: ".*_created$"
{{- end }}
action: drop
{{- end }}
{{- with $valuesPath.podMonitor.metricRelabelings }}
{{ toYaml . | indent 8 }}
{{- end }}
{{- end }}
selector:
matchLabels:
{{- include "pulsar.matchLabels" $root | nindent 6 }}
{{ $matchLabel }}
{{- end -}}

View File

@ -0,0 +1,122 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Probe
*/}}
{{- define "oxia-cluster.probe" -}}
exec:
command: ["oxia", "health", "--port={{ . }}"]
initialDelaySeconds: 10
timeoutSeconds: 10
{{- end }}
{{/*
Probe
*/}}
{{- define "oxia-cluster.readiness-probe" -}}
exec:
command: ["oxia", "health", "--port={{ . }}", "--service=oxia-readiness"]
initialDelaySeconds: 10
timeoutSeconds: 10
{{- end }}
{{/*
Probe
*/}}
{{- define "oxia-cluster.startup-probe" -}}
exec:
command: ["oxia", "health", "--port={{ . }}"]
initialDelaySeconds: 60
timeoutSeconds: 10
{{- end }}
{{/*
Define the pulsar oxia
*/}}
{{- define "pulsar.oxia.server.service" -}}
{{ template "pulsar.fullname" . }}-{{ .Values.oxia.component }}-svc
{{- end }}
{{/*
oxia url for broker metadata
*/}}
{{- define "pulsar.oxia.metadata.url.broker" -}}
{{- if .Values.components.oxia -}}
oxia://{{ template "pulsar.oxia.server.service" . }}:{{ .Values.oxia.server.ports.public }}/broker
{{- end -}}
{{- end -}}
{{/*
oxia url for bookkeeper metadata
*/}}
{{- define "pulsar.oxia.metadata.url.bookkeeper" -}}
{{- if .Values.components.oxia -}}
metadata-store:oxia://{{ template "pulsar.oxia.server.service" . }}:{{ .Values.oxia.server.ports.public }}/bookkeeper
{{- end -}}
{{- end -}}
{{/*
Define coordinator configmap
*/}}
{{- define "oxia.coordinator.config.yaml" -}}
namespaces:
- name: default
initialShardCount: {{ .Values.oxia.initialShardCount }}
replicationFactor: {{ .Values.oxia.replicationFactor }}
- name: broker
initialShardCount: {{ .Values.oxia.initialShardCount }}
replicationFactor: {{ .Values.oxia.replicationFactor }}
- name: bookkeeper
initialShardCount: {{ .Values.oxia.initialShardCount }}
replicationFactor: {{ .Values.oxia.replicationFactor }}
servers:
{{- $servicename := printf "%s-%s-svc" (include "pulsar.fullname" .) .Values.oxia.component }}
{{- $fqdnSuffix := printf "%s.svc.cluster.local" (include "pulsar.namespace" .) }}
{{- $podnamePrefix := printf "%s-%s-server-" (include "pulsar.fullname" .) .Values.oxia.component }}
{{- range until (int .Values.oxia.server.replicas) }}
{{- $podnameIndex := . }}
{{- $podname := printf "%s%d.%s" $podnamePrefix $podnameIndex $servicename }}
{{- $podnameFQDN := printf "%s.%s" $podname $fqdnSuffix }}
- public: {{ $podnameFQDN }}:{{ $.Values.oxia.server.ports.public }}
internal: {{ $podname }}:{{ $.Values.oxia.server.ports.internal }}
{{- end }}
{{- end }}
{{/*
Define coordinator entrypoint
*/}}
{{- define "oxia.coordinator.entrypoint" -}}
- "oxia"
- "coordinator"
{{- if .Values.oxia.coordinator.customConfigMapName }}
- "--conf=configmap:{{ template "pulsar.namespace" . }}/{{ .Values.oxia.coordinator.customConfigMapName }}"
{{- else }}
- "--conf=configmap:{{ template "pulsar.namespace" . }}/{{ template "pulsar.fullname" . }}-{{ .Values.oxia.component }}-coordinator"
{{- end }}
- "--log-json"
- "--metadata=configmap"
- "--k8s-namespace={{ template "pulsar.namespace" . }}"
- "--k8s-configmap-name={{ template "pulsar.fullname" . }}-{{ .Values.oxia.component }}-coordinator-status"
{{- if .Values.oxia.pprofEnabled }}
- "--profile"
{{- end}}
{{- end}}

View File

@ -0,0 +1,95 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define proxy tls certs mounts
*/}}
{{- define "pulsar.proxy.certs.volumeMounts" -}}
{{- if .Values.tls.enabled }}
{{- if .Values.tls.proxy.enabled }}
- mountPath: "/pulsar/certs/proxy"
name: proxy-certs
readOnly: true
{{- end }}
- mountPath: "/pulsar/certs/ca"
name: ca
readOnly: true
{{- end }}
{{- if .Values.tls.proxy.cacerts.enabled }}
- mountPath: "/pulsar/certs/cacerts"
name: proxy-cacerts
{{- range $cert := .Values.tls.proxy.cacerts.certs }}
- name: {{ $cert.name }}
mountPath: "/pulsar/certs/{{ $cert.name }}"
readOnly: true
{{- end }}
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem.sh"
subPath: certs-combine-pem.sh
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem-infinity.sh"
subPath: certs-combine-pem-infinity.sh
{{- end }}
{{- end }}
{{/*
Define proxy tls certs volumes
*/}}
{{- define "pulsar.proxy.certs.volumes" -}}
{{- if .Values.tls.enabled }}
{{- if .Values.tls.proxy.enabled }}
- name: proxy-certs
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.proxy.cert_name }}"
items:
- key: tls.crt
path: tls.crt
- key: tls.key
path: tls.key
{{- if .Values.tls.zookeeper.enabled }}
- key: tls-combined.pem
path: tls-combined.pem
{{- end }}
{{- end }}
- name: ca
secret:
secretName: "{{ template "pulsar.certs.issuers.ca.secretName" . }}"
items:
- key: ca.crt
path: ca.crt
{{- end }}
{{- if .Values.tls.proxy.cacerts.enabled }}
- name: proxy-cacerts
emptyDir: {}
{{- range $cert := .Values.tls.proxy.cacerts.certs }}
- name: {{ $cert.name }}
secret:
secretName: "{{ $cert.existingSecret }}"
items:
{{- range $key := $cert.secretKeys }}
- key: {{ $key }}
path: {{ $key }}
{{- end }}
{{- end }}
- name: certs-scripts
configMap:
name: "{{ template "pulsar.fullname" . }}-certs-scripts"
defaultMode: 0755
{{- end }}
{{- end }}

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define the pulsar toolset service
*/}}
@ -17,7 +36,7 @@ Define toolset zookeeper client tls settings
*/}}
{{- define "pulsar.toolset.zookeeper.tls.settings" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled -}}
/pulsar/keytool/keytool.sh toolset {{ template "pulsar.toolset.hostname" . }} true;
{{- include "pulsar.component.zookeeper.tls.settings" (dict "component" "toolset" "isClient" true "isCacerts" .Values.tls.toolset.cacerts.enabled) -}}
{{- end -}}
{{- end }}
@ -25,18 +44,30 @@ Define toolset zookeeper client tls settings
Define toolset tls certs mounts
*/}}
{{- define "pulsar.toolset.certs.volumeMounts" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
{{- if .Values.tls.enabled }}
{{- if .Values.tls.zookeeper.enabled }}
- name: toolset-certs
mountPath: "/pulsar/certs/toolset"
readOnly: true
{{- end }}
- name: ca
mountPath: "/pulsar/certs/ca"
readOnly: true
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
mountPath: "/pulsar/keytool/keytool.sh"
subPath: keytool.sh
{{- end }}
{{- if .Values.tls.toolset.cacerts.enabled }}
- mountPath: "/pulsar/certs/cacerts"
name: toolset-cacerts
{{- range $cert := .Values.tls.toolset.cacerts.certs }}
- name: {{ $cert.name }}
mountPath: "/pulsar/certs/{{ $cert.name }}"
readOnly: true
{{- end }}
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem.sh"
subPath: certs-combine-pem.sh
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem-infinity.sh"
subPath: certs-combine-pem-infinity.sh
{{- end }}
{{- end }}
@ -44,7 +75,8 @@ Define toolset tls certs mounts
Define toolset tls certs volumes
*/}}
{{- define "pulsar.toolset.certs.volumes" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
{{- if .Values.tls.enabled }}
{{- if .Values.tls.zookeeper.enabled }}
- name: toolset-certs
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.toolset.cert_name }}"
@ -53,17 +85,32 @@ Define toolset tls certs volumes
path: tls.crt
- key: tls.key
path: tls.key
- key: tls-combined.pem
path: tls-combined.pem
{{- end }}
- name: ca
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.ca_suffix }}"
secretName: "{{ template "pulsar.certs.issuers.ca.secretName" . }}"
items:
- key: ca.crt
path: ca.crt
{{- if .Values.tls.zookeeper.enabled }}
- name: keytool
{{- end }}
{{- if .Values.tls.toolset.cacerts.enabled }}
- name: toolset-cacerts
emptyDir: {}
{{- range $cert := .Values.tls.toolset.cacerts.certs }}
- name: {{ $cert.name }}
secret:
secretName: "{{ $cert.existingSecret }}"
items:
{{- range $key := $cert.secretKeys }}
- key: {{ $key }}
path: {{ $key }}
{{- end }}
{{- end }}
- name: certs-scripts
configMap:
name: "{{ template "pulsar.fullname" . }}-keytool-configmap"
name: "{{ template "pulsar.fullname" . }}-certs-scripts"
defaultMode: 0755
{{- end }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,37 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Renders a value that contains template perhaps with scope if the scope is present.
Usage:
{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }}
{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }}
*/}}
{{- define "common.tplvalues.render" -}}
{{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }}
{{- if contains "{{" (toJson .value) }}
{{- if .scope }}
{{- tpl (cat "{{- with $.RelativeScope -}}" $value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }}
{{- else }}
{{- tpl $value .context }}
{{- end }}
{{- else }}
{{- $value }}
{{- end }}
{{- end -}}

View File

@ -0,0 +1,25 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Check deprecated setting auth.authentication.provider since 4.1.0
*/}}
{{- if (and .Values.auth.authentication.enabled (not (empty .Values.auth.authentication.provider))) }}
{{- fail "ERROR: Setting auth.authentication.provider is no longer supported. For details, see the migration guide in README.md." }}
{{- end }}

View File

@ -1,3 +1,22 @@
{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/}}
{{/*
Define the pulsar zookeeper
*/}}
@ -34,6 +53,93 @@ Define zookeeper tls settings
*/}}
{{- define "pulsar.zookeeper.tls.settings" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
/pulsar/keytool/keytool.sh zookeeper {{ template "pulsar.zookeeper.hostname" . }} false;
{{- include "pulsar.component.zookeeper.tls.settings" (dict "component" "zookeeper" "isClient" false "isCacerts" .Values.tls.zookeeper.cacerts.enabled) -}}
{{- end }}
{{- end }}
{{- define "pulsar.component.zookeeper.tls.settings" }}
{{- $component := .component -}}
{{- $isClient := .isClient -}}
{{- $keyFile := printf "/pulsar/certs/%s/tls-combined.pem" $component -}}
{{- $caFile := ternary "/pulsar/certs/cacerts/ca-combined.pem" "/pulsar/certs/ca/ca.crt" .isCacerts -}}
{{- if $isClient }}
echo $'\n' >> conf/pulsar_env.sh
echo "PULSAR_EXTRA_OPTS=\"\${PULSAR_EXTRA_OPTS} -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true -Dzookeeper.client.certReload=true -Dzookeeper.ssl.keyStore.location={{- $keyFile }} -Dzookeeper.ssl.keyStore.type=PEM -Dzookeeper.ssl.trustStore.location={{- $caFile }} -Dzookeeper.ssl.trustStore.type=PEM\"" >> conf/pulsar_env.sh
echo $'\n' >> conf/bkenv.sh
echo "BOOKIE_EXTRA_OPTS=\"\${BOOKIE_EXTRA_OPTS} -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true -Dzookeeper.client.certReload=true -Dzookeeper.ssl.keyStore.location={{- $keyFile }} -Dzookeeper.ssl.keyStore.type=PEM -Dzookeeper.ssl.trustStore.location={{- $caFile }} -Dzookeeper.ssl.trustStore.type=PEM\"" >> conf/bkenv.sh
{{- else }}
echo $'\n' >> conf/pulsar_env.sh
echo "PULSAR_EXTRA_OPTS=\"\${PULSAR_EXTRA_OPTS} -Dzookeeper.ssl.keyStore.location={{- $keyFile }} -Dzookeeper.ssl.keyStore.type=PEM -Dzookeeper.ssl.trustStore.location={{- $caFile }} -Dzookeeper.ssl.trustStore.type=PEM\"" >> conf/pulsar_env.sh
{{- end }}
{{- end }}
{{/*
Define zookeeper tls certs mounts
*/}}
{{- define "pulsar.zookeeper.certs.volumeMounts" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
- mountPath: "/pulsar/certs/zookeeper"
name: zookeeper-certs
readOnly: true
- mountPath: "/pulsar/certs/ca"
name: ca
readOnly: true
{{- end }}
{{- if .Values.tls.zookeeper.cacerts.enabled }}
- mountPath: "/pulsar/certs/cacerts"
name: zookeeper-cacerts
{{- range $cert := .Values.tls.zookeeper.cacerts.certs }}
- name: {{ $cert.name }}
mountPath: "/pulsar/certs/{{ $cert.name }}"
readOnly: true
{{- end }}
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem.sh"
subPath: certs-combine-pem.sh
- name: certs-scripts
mountPath: "/pulsar/bin/certs-combine-pem-infinity.sh"
subPath: certs-combine-pem-infinity.sh
{{- end }}
{{- end }}
{{/*
Define zookeeper tls certs volumes
*/}}
{{- define "pulsar.zookeeper.certs.volumes" -}}
{{- if and .Values.tls.enabled .Values.tls.zookeeper.enabled }}
- name: zookeeper-certs
secret:
secretName: "{{ .Release.Name }}-{{ .Values.tls.zookeeper.cert_name }}"
items:
- key: tls.crt
path: tls.crt
- key: tls.key
path: tls.key
- key: tls-combined.pem
path: tls-combined.pem
- name: ca
secret:
secretName: "{{ template "pulsar.certs.issuers.ca.secretName" . }}"
items:
- key: ca.crt
path: ca.crt
{{- end }}
{{- if .Values.tls.zookeeper.cacerts.enabled }}
- name: zookeeper-cacerts
emptyDir: {}
{{- range $cert := .Values.tls.zookeeper.cacerts.certs }}
- name: {{ $cert.name }}
secret:
secretName: "{{ $cert.existingSecret }}"
items:
{{- range $key := $cert.secretKeys }}
- key: {{ $key }}
path: {{ $key }}
{{- end }}
{{- end }}
- name: certs-scripts
configMap:
name: "{{ template "pulsar.fullname" . }}-certs-scripts"
defaultMode: 0755
{{- end }}
{{- end }}

View File

@ -17,7 +17,7 @@
# under the License.
#
{{- if or .Values.components.autorecovery .Values.extra.autoRecovery }}
{{- if .Values.components.autorecovery }}
apiVersion: v1
kind: ConfigMap
metadata:

Some files were not shown because too many files have changed in this diff Show More