mongo-charms-single-kernel 1.8.8__py3-none-any.whl → 1.8.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mongo-charms-single-kernel might be problematic. Click here for more details.

Files changed (28) hide show
  1. {mongo_charms_single_kernel-1.8.8.dist-info → mongo_charms_single_kernel-1.8.9.dist-info}/METADATA +1 -1
  2. {mongo_charms_single_kernel-1.8.8.dist-info → mongo_charms_single_kernel-1.8.9.dist-info}/RECORD +27 -27
  3. single_kernel_mongo/config/literals.py +7 -0
  4. single_kernel_mongo/config/relations.py +2 -1
  5. single_kernel_mongo/config/statuses.py +127 -20
  6. single_kernel_mongo/core/operator.py +7 -0
  7. single_kernel_mongo/core/structured_config.py +2 -0
  8. single_kernel_mongo/core/workload.py +10 -4
  9. single_kernel_mongo/events/cluster.py +5 -0
  10. single_kernel_mongo/events/sharding.py +3 -1
  11. single_kernel_mongo/events/tls.py +183 -157
  12. single_kernel_mongo/exceptions.py +0 -8
  13. single_kernel_mongo/lib/charms/tls_certificates_interface/v4/tls_certificates.py +1995 -0
  14. single_kernel_mongo/managers/cluster.py +70 -28
  15. single_kernel_mongo/managers/config.py +14 -8
  16. single_kernel_mongo/managers/mongo.py +1 -1
  17. single_kernel_mongo/managers/mongodb_operator.py +44 -22
  18. single_kernel_mongo/managers/mongos_operator.py +16 -20
  19. single_kernel_mongo/managers/sharding.py +154 -127
  20. single_kernel_mongo/managers/tls.py +223 -206
  21. single_kernel_mongo/state/charm_state.py +39 -16
  22. single_kernel_mongo/state/cluster_state.py +8 -0
  23. single_kernel_mongo/state/config_server_state.py +9 -0
  24. single_kernel_mongo/state/tls_state.py +39 -12
  25. single_kernel_mongo/utils/helpers.py +4 -19
  26. single_kernel_mongo/lib/charms/tls_certificates_interface/v3/tls_certificates.py +0 -2123
  27. {mongo_charms_single_kernel-1.8.8.dist-info → mongo_charms_single_kernel-1.8.9.dist-info}/WHEEL +0 -0
  28. {mongo_charms_single_kernel-1.8.8.dist-info → mongo_charms_single_kernel-1.8.9.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mongo-charms-single-kernel
3
- Version: 1.8.8
3
+ Version: 1.8.9
4
4
  Summary: Shared and reusable code for Mongo-related charms
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,31 +1,31 @@
1
1
  single_kernel_mongo/__init__.py,sha256=yTtXuLHbaXGJ5IgR7PhhNOzmqlpqywkTNI4bmkNECQ4,421
2
2
  single_kernel_mongo/abstract_charm.py,sha256=x8LnydlO2hoiJBp_ijRUNrfOH1YrvpcZy5SpuYR1jdg,5762
3
3
  single_kernel_mongo/config/__init__.py,sha256=OGTmp5MZXk2ZGgElT0A1yVyQz6FB4JzjG34mbeIWG2k,128
4
- single_kernel_mongo/config/literals.py,sha256=8e6s8L6ehDBeqgQ65pT96qFtLFlfXZaKFkPtrYUxCLY,2023
4
+ single_kernel_mongo/config/literals.py,sha256=OH5vzTYdDaPtyZ-Qope-cYpsdxN_GEa43ElIn_98T3Q,2113
5
5
  single_kernel_mongo/config/models.py,sha256=MruFI2EJndfH3KaJ5iaNar1oyMrTfSZaTQ3yxTxllnc,6770
6
- single_kernel_mongo/config/relations.py,sha256=fV0_x46OV4nTxbqQx_TNRO3BAxGht9Q_3pej23MgiP0,1047
7
- single_kernel_mongo/config/statuses.py,sha256=sjXIWwlZu8RgCV2mrtn9J9eoGOFEpbqYa35flDy6wXs,21183
6
+ single_kernel_mongo/config/relations.py,sha256=CisZvNUNEy27_oxEme_WpmZbN7DuDGfh4EUrAeoJprw,1096
7
+ single_kernel_mongo/config/statuses.py,sha256=hJ-BB-o85DfnRwEU-_6SGzMzebmYbDZNSvcBmHvL2hc,25761
8
8
  single_kernel_mongo/core/__init__.py,sha256=K1XAyFSIkldkT-008Eeg_o7H_XveWaxRuXGJnwoB_DU,124
9
9
  single_kernel_mongo/core/abstract_upgrades_v3.py,sha256=AU_eiZ5PU76mcJWoXcZZRaVWCTAZqLyw0RXk3J3bxbQ,5744
10
10
  single_kernel_mongo/core/k8s_workload.py,sha256=wp3plDVg6h8vfG8Zpi_p2mq_TNP_2uBlPMt0kWlWrgk,5442
11
11
  single_kernel_mongo/core/kubernetes_upgrades_v3.py,sha256=OdzU2g2m2_QI9fAzxaJKnAek5dEc9ZxQ05bgqIT7GHw,339
12
12
  single_kernel_mongo/core/machine_upgrades_v3.py,sha256=ae_ehbL_dK778qhF3YYy4BB7ir9uekKp0HIdtf_S41o,1961
13
- single_kernel_mongo/core/operator.py,sha256=xgmDfMS_loqxsNtnyhSrRenaSulARIgTf8szA9p1at4,14551
13
+ single_kernel_mongo/core/operator.py,sha256=3k5CNyvndaNMjkLYMGMajX1saVUEAxSJi98CAvzyitI,14760
14
14
  single_kernel_mongo/core/secrets.py,sha256=SOS19OhzpWdPur7JpggJ84u333tNyapTEgf_kjDjD6M,6755
15
- single_kernel_mongo/core/structured_config.py,sha256=wUC6RyzvnL7L7lKmf0cD0V1h0YN5e20Hc0uZAMCD0K4,4246
15
+ single_kernel_mongo/core/structured_config.py,sha256=5M2za_9Kh7_8tLLS16BcIBxU6EmtlmMqVHF-AczPDYc,4434
16
16
  single_kernel_mongo/core/version_checker.py,sha256=q8HZZUvy-h3CKxcaCtBss6UvwoexD92OaLmru6ikuJ0,3711
17
17
  single_kernel_mongo/core/vm_workload.py,sha256=7KUgc82DaWVaxx3UEypuLZ3AIR_dlnqDnB6sorhbArw,7043
18
- single_kernel_mongo/core/workload.py,sha256=l0AqhnvgcXfrm0c-mKcGUf3-hoo5Gzc8EhQh01RfQKU,10107
18
+ single_kernel_mongo/core/workload.py,sha256=EHQdsL9uLb4zREChobxa9QvlzT1a1efMLkV2wAjaBBI,10239
19
19
  single_kernel_mongo/events/__init__.py,sha256=xatr1vi0ZKdqF1X-L2vaRuz1vJHwxschJu0XYxd_zoM,126
20
20
  single_kernel_mongo/events/backups.py,sha256=01yq8bk5n2YlbNA0XcBT5ENSK1EsT8WmtDPh-M_zmEM,13168
21
- single_kernel_mongo/events/cluster.py,sha256=oEKrdB6UCdUnSV12Kh1Nm3k2fTHxGQ9rLLW8lbRu0cY,7802
21
+ single_kernel_mongo/events/cluster.py,sha256=503SETbcmbkML98uDOnECdDSyaxmGPhrsXC50gaByLo,8185
22
22
  single_kernel_mongo/events/database.py,sha256=xcmeLnEnYyaL2Y7e-peHEVRZUKuM8w0w9Eh-9f8t7U4,6046
23
23
  single_kernel_mongo/events/ldap.py,sha256=XyU-2BD7hqqQ6EvEZvVXaHTtFX-4Nu2w5fdBhEB3oRk,6510
24
24
  single_kernel_mongo/events/lifecycle.py,sha256=huLQemAFfqNlCOu1AxsYHz9tCMBCvS1Ps2DvEXYcCuY,10927
25
25
  single_kernel_mongo/events/primary_action.py,sha256=S7BE2BPnqZwXMuAZbn-OjfsZtTR-pe7Pdo69nimSCG4,1304
26
- single_kernel_mongo/events/sharding.py,sha256=A5T7n7P36u_7_7QoTfRy4TWUsPT-rYan7ZWxWmTnYxQ,7259
27
- single_kernel_mongo/events/tls.py,sha256=SN43SWlpsfCe9V3f__eJGWnj0q72ne6MqnEsvTucSmU,8891
28
- single_kernel_mongo/exceptions.py,sha256=frF-vmLwSQH9BxgRgnZTfkkihnyf3epv1pHz31RkOaY,7416
26
+ single_kernel_mongo/events/sharding.py,sha256=8bwt7vdF1EZNrSamie6L78LKfnWzi30I0eKAbdXZh9k,7414
27
+ single_kernel_mongo/events/tls.py,sha256=W5uglBFU17iWYs47jw5rDolqUcYp5TntyeVY9c6rP74,10036
28
+ single_kernel_mongo/exceptions.py,sha256=pOkJJfdN2EWiWPFrTmFnk_T4USc3zHnGtjCwLpE3hs4,7194
29
29
  single_kernel_mongo/lib/charms/certificate_transfer_interface/v0/certificate_transfer.py,sha256=KnvPKlHwkUSn1ND5fJ6ddAiBussfITBw5dMGKPqy8-8,17999
30
30
  single_kernel_mongo/lib/charms/data_platform_libs/v0/data_interfaces.py,sha256=BOabAUHQ2KeHHWA_BpB45sFEUz_RdGcf3YWUAAw6gXw,202649
31
31
  single_kernel_mongo/lib/charms/data_platform_libs/v0/s3.py,sha256=INOhfzcJWr7eXxVgvVqtenVeoODnSxjgFne6AbL_3bY,28557
@@ -37,19 +37,19 @@ single_kernel_mongo/lib/charms/operator_libs_linux/v0/sysctl.py,sha256=FwLyNGlNV
37
37
  single_kernel_mongo/lib/charms/operator_libs_linux/v1/systemd.py,sha256=eyexodlMtvlcX7yUl5PBeJyOVAr8QapuyB0aGi8upno,8505
38
38
  single_kernel_mongo/lib/charms/operator_libs_linux/v2/snap.py,sha256=9vycyj8zDYqBRpNiSlR28DX1f7ZEw2zJbJwxfj_eIUM,48916
39
39
  single_kernel_mongo/lib/charms/prometheus_k8s/v0/prometheus_scrape.py,sha256=Wrq14k-KwYRAK7sfF3ycy4Agb7Ez7qKzjfjUFD3z7vw,99121
40
- single_kernel_mongo/lib/charms/tls_certificates_interface/v3/tls_certificates.py,sha256=N0Z9vZsySy1L4UyPCfFFFs5COIQMjnNa5X-1ALSWltI,94254
40
+ single_kernel_mongo/lib/charms/tls_certificates_interface/v4/tls_certificates.py,sha256=Y6nI8mtF-IQP8g2DvRr9Y3J10GJ8CTOejnfEHvRgEjo,82104
41
41
  single_kernel_mongo/managers/__init__.py,sha256=EUhvtK85skMEcT3yacYwezyIW4ajsoC5SwxpZcmPZnM,145
42
42
  single_kernel_mongo/managers/backups.py,sha256=L5UrxCSoYEJI8dtWA4tikNvTo71IQJqtMamvgKxsTGQ,40176
43
- single_kernel_mongo/managers/cluster.py,sha256=IjifWuqa7cUDnLCKUDDL0KiBEnQvkp0nSN2LepJ3gGU,20672
44
- single_kernel_mongo/managers/config.py,sha256=wHMs6XLuWKGOxDCKh_L66HJKP6y1OAepKv21_CuijRI,18332
43
+ single_kernel_mongo/managers/cluster.py,sha256=FhqbWFuozstdXMB1cO7QYMDMguhCrGSQY-uISuZaNaM,22557
44
+ single_kernel_mongo/managers/config.py,sha256=F4qszxKV5A8ZPlpRXFWm5xXnjRFEqM5eouSCnLP4hqQ,18609
45
45
  single_kernel_mongo/managers/k8s.py,sha256=I9NNaUKYlOGt6JoTa3gicqzPdO9yPWgO4tPgGBac1uQ,11036
46
46
  single_kernel_mongo/managers/ldap.py,sha256=xDyfWZWdrku1WY1phAJELPZAwynBM1Q2bXRA2gOyQto,15823
47
- single_kernel_mongo/managers/mongo.py,sha256=_ffIIsDsR59v9SJN9sZ1Fg_QEGLM4XRCziyENSBG7eg,24325
48
- single_kernel_mongo/managers/mongodb_operator.py,sha256=stS2-IXS1SRHMM6q-H0wAxuJ5U-HRsqh0vfsYDlXOQU,55989
49
- single_kernel_mongo/managers/mongos_operator.py,sha256=8MFM5HpxllG4_CJBh5VfuqK-dYDlqa03WNsDoqnKGOA,25487
47
+ single_kernel_mongo/managers/mongo.py,sha256=SMGion-lciKU9REzI7HTHs_R8rMafngbZzS7BfAWybc,24326
48
+ single_kernel_mongo/managers/mongodb_operator.py,sha256=fcBSmV3ELs5x3NYhBAVN_iIYk1cwS7snP7-0mmOm8oY,56703
49
+ single_kernel_mongo/managers/mongos_operator.py,sha256=ZVW7eIsQo0DmK4VzYruDlMsQkKL_ju4TtJkU4FXGIJo,25475
50
50
  single_kernel_mongo/managers/observability.py,sha256=j5Nt5Wv43HaYVcr2f6Y_DqHJaP5XhUMjjh7Gg8JwsZI,3584
51
- single_kernel_mongo/managers/sharding.py,sha256=0CYPFHZiwqsQGSaTY40r3FYnhtW4ftQkeZxLqqWDOHg,46045
52
- single_kernel_mongo/managers/tls.py,sha256=7WRR8nV2Tq3LCyxZmvRqteUxbbi1_ITIunfxYQi9Mpg,15481
51
+ single_kernel_mongo/managers/sharding.py,sha256=l2HYRdziu3yHq9mS8xuH5EwQHNG9Bz4HnVwHKPw2gqs,47461
52
+ single_kernel_mongo/managers/tls.py,sha256=-r0hj2b5LuHh-2Md1ask3CdICC09A5yiYzC6OjGuTpY,15834
53
53
  single_kernel_mongo/managers/upgrade_v3.py,sha256=Wci00SC1Ey599T0VefWHbfsl3nnqUVNru7RU3qJnCbY,19673
54
54
  single_kernel_mongo/managers/upgrade_v3_status.py,sha256=IRo4Geyv3mUmqy8QgnD4qWzQaTHLiGkMkKD1dC4ZZq4,5770
55
55
  single_kernel_mongo/observability_rules/__init__.py,sha256=VuClFh0iGrw64cP4JppbSotFRyGpNVGmT8oD8pAbJoM,146
@@ -61,12 +61,12 @@ single_kernel_mongo/observability_rules/vm_prometheus_alert_rules/percona-mongod
61
61
  single_kernel_mongo/state/__init__.py,sha256=V5TWoUtibFiyVO0BqPHnZOZrLNTIIgiVm3vmrhw8tS4,145
62
62
  single_kernel_mongo/state/abstract_state.py,sha256=2bSGXu0KehBw_XIu7THWZEVzrX6C8-73_9mlUrfEMXg,2471
63
63
  single_kernel_mongo/state/app_peer_state.py,sha256=ul2Z4EBFBm2HW58UaDFrR0mgj6cE8O5zWPzlTPRl8Cs,7501
64
- single_kernel_mongo/state/charm_state.py,sha256=yiYsRuUuP-7uIenxAKK531QZSLeqpmt2KTEYVU9CqbY,29359
65
- single_kernel_mongo/state/cluster_state.py,sha256=KI2Ful1H-ChkUC5kJfp0nUfe8m3SGFW5rx9to-sNKSQ,2947
66
- single_kernel_mongo/state/config_server_state.py,sha256=L-UZv3S1mBzgQJu23dnwNFvBq9Gc4AUD4Q2c9IEYCbw,3799
64
+ single_kernel_mongo/state/charm_state.py,sha256=-g-Ag5zbfmyM9-caXsE_j2xWeNb2s3P_FwUbdqNZHUY,30279
65
+ single_kernel_mongo/state/cluster_state.py,sha256=CmtC2ztAl02K_UEzix-jnObHri72m1pplzUbO7HKLB8,3228
66
+ single_kernel_mongo/state/config_server_state.py,sha256=u9mr_-OCuIgbadHDLNxVkzL23qigVAn84GbnSemg-yo,4109
67
67
  single_kernel_mongo/state/ldap_state.py,sha256=7XxjYoFMI8vujlqbCj5JyqigIlmYc-ebL9e0MEDW23Q,7915
68
68
  single_kernel_mongo/state/models.py,sha256=Ipfy2OdCekL1bIBr22Cb-pJiYhQdNvLIZYR4wPmc30g,592
69
- single_kernel_mongo/state/tls_state.py,sha256=pCdMBxCXdJaYiDKqTyNz1D7yDX0WwaiBfC6NZdscg7c,2300
69
+ single_kernel_mongo/state/tls_state.py,sha256=CVNvMHmsX83wgStOHwWTOqqApv9LTm4lJLQFDqoNFSQ,3413
70
70
  single_kernel_mongo/state/unit_peer_state.py,sha256=99Qn6DkKXO_y5isuLXICfrQeVg3uqy0uW_48g7WqGK0,4080
71
71
  single_kernel_mongo/templates/__init__.py,sha256=8-zJnYHONfuTjeihx1ZL34URMW6c_MwJaIMBJgoPGTc,141
72
72
  single_kernel_mongo/templates/enable-transparent-huge-pages.service.j2,sha256=hHYGtnZq9pVsx4jqNxiyuvnqK5rDf-WM6OsktfhJzBk,511
@@ -74,7 +74,7 @@ single_kernel_mongo/templates/ldap.conf.j2,sha256=aPTzSu42jheL1i3RXAp6P7SQRIdmPf
74
74
  single_kernel_mongo/templates/logrotate.j2,sha256=iemZzi9hHjA9ANzP7QxW63mdM7fJRUzqkqgsR2qpPQU,753
75
75
  single_kernel_mongo/utils/__init__.py,sha256=JH9SDM2bQq7R5hb1nRTeUKQVHbdqg6RbQu5-qAJ0Xpg,116
76
76
  single_kernel_mongo/utils/event_helpers.py,sha256=_rVQZKjs0osHGtjA5LEdV5LTnxCVXGPe2UY8wmRazBE,981
77
- single_kernel_mongo/utils/helpers.py,sha256=VdDERCFkUxMZ2SzLEl76BBrzcEjkFVmz509e0_e-Uac,4006
77
+ single_kernel_mongo/utils/helpers.py,sha256=N99hZq9USaWdi87XU9JR2W8SP9KfdAOaJy5f85xQ2ZE,3584
78
78
  single_kernel_mongo/utils/mongo_config.py,sha256=tU7dGUZPSWdfttUn868vi_q5y6EWvGN2SREfexM8pxU,4134
79
79
  single_kernel_mongo/utils/mongo_connection.py,sha256=330gz1Ha5WdfdfxYmci1jVRnrRswtomoukn3AASSXCU,28540
80
80
  single_kernel_mongo/utils/mongo_error_codes.py,sha256=mM_KHTR3b9UA4BaxmzSlCVrFUNhRAc458ndBvJ4fg_8,479
@@ -85,7 +85,7 @@ single_kernel_mongo/workload/log_rotate_workload.py,sha256=VmWUJ_mqxN4v_IAFHw6lL
85
85
  single_kernel_mongo/workload/mongodb_workload.py,sha256=UHXVUQI1FyAhnP2TTLKiTFWWrUUaX-On4wDIsT5DXvQ,1527
86
86
  single_kernel_mongo/workload/mongos_workload.py,sha256=p1ZjqbGTokcxNnqKCvCIUQvmDvkOcN8pRvkPfA7Rgeg,1815
87
87
  single_kernel_mongo/workload/monitor_workload.py,sha256=dw-F3Y11_jpqI30Hg30-y6kxFFXGnHcSbgdAAJE8C8Q,1793
88
- mongo_charms_single_kernel-1.8.8.dist-info/METADATA,sha256=dY1Trv07HoAiqp6LaI8bZgc2JzNjfh37l4NVRzGVhD4,5310
89
- mongo_charms_single_kernel-1.8.8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
90
- mongo_charms_single_kernel-1.8.8.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
- mongo_charms_single_kernel-1.8.8.dist-info/RECORD,,
88
+ mongo_charms_single_kernel-1.8.9.dist-info/METADATA,sha256=Nh_SFhIekPoSscT6kfdNC-Ui8vdQ9TeUF47jeAebrr0,5310
89
+ mongo_charms_single_kernel-1.8.9.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
90
+ mongo_charms_single_kernel-1.8.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
+ mongo_charms_single_kernel-1.8.9.dist-info/RECORD,,
@@ -34,6 +34,13 @@ class Scope(str, Enum):
34
34
  UNIT = "unit"
35
35
 
36
36
 
37
+ class TLSType(str, Enum):
38
+ """TLS types."""
39
+
40
+ PEER = "peer"
41
+ CLIENT = "client"
42
+
43
+
37
44
  class MongoPorts(IntEnum):
38
45
  """The default Mongo ports."""
39
46
 
@@ -35,7 +35,8 @@ class Scopes(str, Enum):
35
35
  class ExternalRequirerRelations(str, Enum):
36
36
  """The relations we require externally."""
37
37
 
38
- TLS = "certificates"
38
+ CLIENT_TLS = "client-certificates"
39
+ PEER_TLS = "peer-certificates"
39
40
  S3_CREDENTIALS = "s3-credentials"
40
41
  LDAP = "ldap"
41
42
  LDAP_CERT = "ldap-certificate-transfer"
@@ -118,24 +118,45 @@ class MongosStatuses(Enum):
118
118
  check="Config validation failed.",
119
119
  action="Set the expose-external config to a valid value: `nodeport` or `none`.",
120
120
  )
121
- MISSING_TLS_REL = StatusObject(
121
+ MISSING_PEER_TLS_REL = StatusObject(
122
122
  status="blocked",
123
- message="TLS must be enabled in mongos, since it is enabled on the config-server in the cluster relation.",
124
- short_message="Missing certificates relation.",
123
+ message="Peer TLS must be enabled in mongos, since it is enabled on the config-server in the cluster relation.",
124
+ short_message="Missing peer-certificates relation.",
125
125
  check="Relation validation failed.",
126
- action="Add the certificates relation (tls-certificates interface) to mongos.",
126
+ action="Add the peer-certificates relation to mongos.",
127
127
  )
128
- INVALID_TLS_REL = StatusObject(
128
+ INVALID_PEER_TLS_REL = StatusObject(
129
129
  status="blocked",
130
- message="TLS must be disabled in mongos, since it is disabled on the config-server in the cluster relation.",
131
- short_message="Invalid certificates relation.",
130
+ message="Peer TLS must be disabled in mongos, since it is disabled on the config-server in the cluster relation.",
131
+ short_message="Invalid peer-certificates relation.",
132
132
  check="Relation validation failed.",
133
- action="Remove the certificates relation (tls-certificates interface) from this application.",
133
+ action="Remove the peer-certificates relation from this application.",
134
134
  )
135
- CA_MISMATCH = StatusObject(
135
+ MISSING_CLIENT_TLS_REL = StatusObject(
136
136
  status="blocked",
137
- message="The mongos CA and Config-Server CA don't match.",
138
- short_message="CA mismatch.",
137
+ message="Client TLS must be enabled in mongos, since it is enabled on the config-server in the cluster relation.",
138
+ short_message="Missing client-certificates relation.",
139
+ check="Relation validation failed.",
140
+ action="Add the client-certificates relation to mongos.",
141
+ )
142
+ INVALID_CLIENT_TLS_REL = StatusObject(
143
+ status="blocked",
144
+ message="Client TLS must be disabled in mongos, since it is disabled on the config-server in the cluster relation.",
145
+ short_message="Invalid client-certificates relation.",
146
+ check="Relation validation failed.",
147
+ action="Remove the client-certificates relation from this application.",
148
+ )
149
+ PEER_CA_MISMATCH = StatusObject(
150
+ status="blocked",
151
+ message="The mongos peer CA and Config-Server peer CA don't match.",
152
+ short_message="Peer CA mismatch.",
153
+ check="Relation validation failed.",
154
+ action="Verify the certificates relations. Use the same CA for all cluster components.",
155
+ )
156
+ CLIENT_CA_MISMATCH = StatusObject(
157
+ status="blocked",
158
+ message="The mongos client CA and Config-Server client CA don't match.",
159
+ short_message="Client CA mismatch.",
139
160
  check="Relation validation failed.",
140
161
  action="Verify the certificates relations. Use the same CA for all cluster components.",
141
162
  )
@@ -153,6 +174,27 @@ class MongosStatuses(Enum):
153
174
  status="maintenance", message="Starting mongos.", running="blocking"
154
175
  )
155
176
 
177
+ @classmethod
178
+ def missing_tls(cls, internal: bool) -> StatusObject:
179
+ """Correct status."""
180
+ if internal:
181
+ return cls.MISSING_PEER_TLS_REL.value
182
+ return cls.MISSING_CLIENT_TLS_REL.value
183
+
184
+ @classmethod
185
+ def invalid_tls(cls, internal: bool) -> StatusObject:
186
+ """Correct status."""
187
+ if internal:
188
+ return cls.INVALID_PEER_TLS_REL.value
189
+ return cls.INVALID_CLIENT_TLS_REL.value
190
+
191
+ @classmethod
192
+ def incompatible_ca(cls, internal: bool) -> StatusObject:
193
+ """Correct status."""
194
+ if internal:
195
+ return cls.PEER_CA_MISMATCH.value
196
+ return cls.CLIENT_CA_MISMATCH.value
197
+
156
198
 
157
199
  class CharmStatuses(Enum):
158
200
  """Charm Statuses."""
@@ -182,11 +224,28 @@ class CharmStatuses(Enum):
182
224
  class TLSStatuses(Enum):
183
225
  """TLS statuses."""
184
226
 
185
- # RUNNING statuses:
186
- DISABLING_TLS = StatusObject(
227
+ INVALID_PEER_PRIVATE_KEY = StatusObject(
228
+ status="blocked",
229
+ message="Invalid peer private key",
230
+ check="Peer private key format validation failed",
231
+ action="Update the peer private key secret.",
232
+ )
233
+ INVALID_CLIENT_PRIVATE_KEY = StatusObject(
234
+ status="blocked",
235
+ message="Invalid client private key",
236
+ check="Client private key format validation failed.",
237
+ action="Update the client privatekey secret.",
238
+ )
239
+ DISABLING_PEER_TLS = StatusObject(
187
240
  status="maintenance",
188
- message="Disabling TLS...",
189
- check="Certificates relation (tls-certificates interface) removed.",
241
+ message="Disabling peer TLS...",
242
+ check="Peer certificates relation (tls-certificates interface) removed.",
243
+ running="blocking",
244
+ )
245
+ DISABLING_CLIENT_TLS = StatusObject(
246
+ status="maintenance",
247
+ message="Disabling client TLS...",
248
+ check="Client certificates relation (tls-certificates interface) removed.",
190
249
  running="blocking",
191
250
  )
192
251
  # Enabling TLS takes a while because we wait for multiple certs so it's
@@ -343,12 +402,39 @@ class ConfigServerStatuses(Enum):
343
402
  class ShardStatuses(Enum):
344
403
  """Shard statuses."""
345
404
 
346
- REQUIRES_TLS = StatusObject(status="blocked", message="Shard requires TLS to be enabled.")
347
- REQUIRES_NO_TLS = StatusObject(
348
- status="blocked", message="Shard has TLS enabled, but config-server does not."
405
+ MISSING_PEER_TLS_REL = StatusObject(
406
+ status="blocked", message="Shard requires peer TLS to be enabled."
349
407
  )
350
- CA_MISMATCH = StatusObject(
351
- status="blocked", message="Shard CA and Config-Server CA don't match."
408
+ INVALID_PEER_TLS_REL = StatusObject(
409
+ status="blocked",
410
+ message="Peer TLS must be disabled in shard, since it is disabled in the related config-server.",
411
+ short_message="Invalid peer-certificates relation.",
412
+ check="Relation validation failed.",
413
+ action="Align the peer TLS configuration in all the cluster components: remove the peer-certificates relation from the shard.",
414
+ )
415
+ MISSING_CLIENT_TLS_REL = StatusObject(
416
+ status="blocked", message="Shard requires client TLS to be enabled."
417
+ )
418
+ INVALID_CLIENT_TLS_REL = StatusObject(
419
+ status="blocked",
420
+ message="Peer TLS must be disabled in shard, since it is disabled in the related config-server.",
421
+ short_message="Invalid client-certificates relation.",
422
+ check="Relation validation failed.",
423
+ action="Align the peer TLS configuration in all the cluster components: remove the client-certificates relation from the shard.",
424
+ )
425
+ PEER_CA_MISMATCH = StatusObject(
426
+ status="blocked",
427
+ message="Shard internal CA and Config-Server internal CA don't match.",
428
+ short_message="Peer CA mismatch.",
429
+ check="Relation validation failed.",
430
+ action="Verify the peer-certificates relations. Use the same CA for all cluster components.",
431
+ )
432
+ CLIENT_CA_MISMATCH = StatusObject(
433
+ status="blocked",
434
+ message="Shard client CA and Config-Server client CA don't match.",
435
+ short_message="Client CA mismatch.",
436
+ check="Relation validation failed.",
437
+ action="Verify the client-certificates relations. Use the same CA for all cluster components.",
352
438
  )
353
439
 
354
440
  MISSING_CONF_SERVER_REL = StatusObject(
@@ -399,6 +485,27 @@ class ShardStatuses(Enum):
399
485
  message=f"Charm revision ({current_charms_version}{local_identifier}) is not up-to date with config-server.",
400
486
  )
401
487
 
488
+ @classmethod
489
+ def missing_tls(cls, internal: bool) -> StatusObject:
490
+ """Correct status."""
491
+ if internal:
492
+ return cls.MISSING_PEER_TLS_REL.value
493
+ return cls.MISSING_CLIENT_TLS_REL.value
494
+
495
+ @classmethod
496
+ def invalid_tls(cls, internal: bool) -> StatusObject:
497
+ """Correct status."""
498
+ if internal:
499
+ return cls.INVALID_PEER_TLS_REL.value
500
+ return cls.INVALID_CLIENT_TLS_REL.value
501
+
502
+ @classmethod
503
+ def incompatible_ca(cls, internal: bool) -> StatusObject:
504
+ """Correct status."""
505
+ if internal:
506
+ return cls.PEER_CA_MISMATCH.value
507
+ return cls.CLIENT_CA_MISMATCH.value
508
+
402
509
 
403
510
  class MongodStatuses(Enum):
404
511
  """MongoD statuses."""
@@ -37,6 +37,7 @@ from single_kernel_mongo.config.literals import (
37
37
  TrustStoreFiles,
38
38
  )
39
39
  from single_kernel_mongo.config.models import SNAP_NAME, THP_CONFIG, CharmSpec, LogRotateConfig
40
+ from single_kernel_mongo.core.structured_config import MongoConfigModel
40
41
  from single_kernel_mongo.events.ldap import LDAPEventHandler
41
42
  from single_kernel_mongo.exceptions import (
42
43
  DeferrableFailedHookChecksError,
@@ -106,6 +107,12 @@ class OperatorProtocol(ABC, Object, ManagerStatusProtocol):
106
107
 
107
108
  def __init__(self, dependent: AbstractMongoCharm): ...
108
109
 
110
+ @property
111
+ @abstractmethod
112
+ def config(self) -> MongoConfigModel:
113
+ """The pydantic model of the config."""
114
+ ...
115
+
109
116
  @property
110
117
  @abstractmethod
111
118
  def components(self) -> tuple[ManagerStatusProtocol, ...]:
@@ -100,6 +100,8 @@ class MongoConfigModel(BaseConfigModel):
100
100
  role: SerializeLiteralAsStr[MongoDBRoles]
101
101
  ldap_user_to_dn_mapping: str | None = Field(default=None, alias="ldap-user-to-dn-mapping")
102
102
  ldap_query_template: str | None = Field(default=None, alias="ldap-query-template")
103
+ tls_peer_private_key_id: str | None = Field(default=None, alias="tls-peer-private-key")
104
+ tls_client_private_key_id: str | None = Field(default=None, alias="tls-client-private-key")
103
105
 
104
106
  @field_validator("expose_external", mode="before")
105
107
  @classmethod
@@ -93,15 +93,21 @@ class MongoPaths:
93
93
  return Path(f"{self.conf_path}/internal-ca.crt")
94
94
 
95
95
  @property
96
- def tls_files(self) -> set[Path]:
97
- """Set of all TLS files."""
96
+ def tls_peer_files(self) -> set[Path]:
97
+ """Set of peer TLS files."""
98
98
  return {
99
- self.ext_pem_file,
100
- self.ext_ca_file,
101
99
  self.int_pem_file,
102
100
  self.int_ca_file,
103
101
  }
104
102
 
103
+ @property
104
+ def tls_client_files(self) -> set[Path]:
105
+ """Set of client TLS files."""
106
+ return {
107
+ self.ext_pem_file,
108
+ self.ext_ca_file,
109
+ }
110
+
105
111
  @property
106
112
  def ldap_path(self) -> Path:
107
113
  """The LDAP conf path."""
@@ -136,6 +136,11 @@ class ClusterMongosEventHandler(Object):
136
136
  def _on_relation_created(self, event: RelationCreatedEvent) -> None:
137
137
  """Relation created event handler."""
138
138
  self.manager.set_relation_created_status()
139
+ # Edge condition: mongos was integrated with the certificates provider
140
+ # before being integrated with the config-server. We trigger the refresh
141
+ # of the certificates to use the config-server as CSR subject.
142
+ if self.manager.state.peer_tls_relation or self.manager.state.client_tls_relation:
143
+ self.dependent.tls_events.refresh_certificates()
139
144
 
140
145
  def _on_database_created(self, event: DatabaseCreatedEvent) -> None:
141
146
  """Database Created event handler.
@@ -162,8 +162,10 @@ class ShardEventHandler(Object):
162
162
  """SecretChanged event handler, which is used to propagate the updated passwords."""
163
163
  try:
164
164
  self.manager.handle_secret_changed(event.secret.label or "")
165
- except (NotReadyError, FailedToUpdateCredentialsError):
165
+ except (NotReadyError, FailedToUpdateCredentialsError, DeferrableFailedHookChecksError):
166
166
  event.defer()
167
+ except NonDeferrableFailedHookChecksError as e:
168
+ logger.info(f"Skipping {str(type(event))}: {str(e)}")
167
169
  except WaitingForSecretsError:
168
170
  logger.info("Missing secrets, ignoring")
169
171