mongo-charms-single-kernel 1.8.9__tar.gz → 1.8.10__tar.gz
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.
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/PKG-INFO +1 -1
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/pyproject.toml +1 -1
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/config/literals.py +5 -5
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/config.py +10 -6
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/mongo.py +11 -11
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/mongodb_operator.py +14 -12
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/sharding.py +21 -12
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/upgrade_v3.py +6 -6
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/charm_state.py +15 -15
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/config_server_state.py +6 -6
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/models.py +2 -2
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/mongodb_users.py +20 -20
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/LICENSE +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/README.md +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/abstract_charm.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/config/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/config/models.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/config/relations.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/config/statuses.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/abstract_upgrades_v3.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/k8s_workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/kubernetes_upgrades_v3.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/machine_upgrades_v3.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/operator.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/secrets.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/structured_config.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/version_checker.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/vm_workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/core/workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/backups.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/cluster.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/database.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/ldap.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/lifecycle.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/primary_action.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/sharding.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/events/tls.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/exceptions.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/certificate_transfer_interface/v0/certificate_transfer.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/data_platform_libs/v0/data_interfaces.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/data_platform_libs/v0/s3.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/glauth_k8s/v0/ldap.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/grafana_agent/v0/cos_agent.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/grafana_k8s/v0/grafana_dashboard.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/loki_k8s/v0/loki_push_api.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/operator_libs_linux/v0/sysctl.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/operator_libs_linux/v1/systemd.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/operator_libs_linux/v2/snap.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/prometheus_k8s/v0/prometheus_scrape.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/lib/charms/tls_certificates_interface/v4/tls_certificates.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/backups.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/cluster.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/k8s.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/ldap.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/mongos_operator.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/observability.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/tls.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/managers/upgrade_v3_status.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/observability_rules/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/observability_rules/grafana_dashboards/MongoDB_Cluster_Summary.json +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/observability_rules/grafana_dashboards/MongoDB_ReplSet_Summary.json +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/observability_rules/k8s_prometheus_alert_rules/percona-mongodb-exporter.rule +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/observability_rules/loki/.gitkeep +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/observability_rules/vm_prometheus_alert_rules/percona-mongodb-exporter.yml +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/abstract_state.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/app_peer_state.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/cluster_state.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/ldap_state.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/tls_state.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/state/unit_peer_state.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/templates/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/templates/enable-transparent-huge-pages.service.j2 +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/templates/ldap.conf.j2 +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/templates/logrotate.j2 +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/event_helpers.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/helpers.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/mongo_config.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/mongo_connection.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/utils/mongo_error_codes.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/workload/__init__.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/workload/backup_workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/workload/log_rotate_workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/workload/mongodb_workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/workload/mongos_workload.py +0 -0
- {mongo_charms_single_kernel-1.8.9 → mongo_charms_single_kernel-1.8.10}/single_kernel_mongo/workload/monitor_workload.py +0 -0
|
@@ -51,13 +51,13 @@ class MongoPorts(IntEnum):
|
|
|
51
51
|
class InternalUsernames(str, Enum):
|
|
52
52
|
"""The allowed internal usernames."""
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
CHARMED_OPERATOR = "charmed-operator"
|
|
55
|
+
CHARMED_BACKUP = "charmed-backup"
|
|
56
|
+
CHARMED_STATS = "charmed-stats"
|
|
57
|
+
CHARMED_LOGROTATE = "charmed-logrotate"
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
SECRETS_APP = [f"{
|
|
60
|
+
SECRETS_APP = [f"{username}-password" for username in InternalUsernames] + ["keyfile"]
|
|
61
61
|
|
|
62
62
|
VERSIONS_FILE = Path("refresh_versions.toml")
|
|
63
63
|
|
|
@@ -28,7 +28,11 @@ from single_kernel_mongo.core.structured_config import MongoConfigModel, MongoDB
|
|
|
28
28
|
from single_kernel_mongo.core.workload import WorkloadBase
|
|
29
29
|
from single_kernel_mongo.exceptions import WorkloadServiceError
|
|
30
30
|
from single_kernel_mongo.state.charm_state import CharmState
|
|
31
|
-
from single_kernel_mongo.utils.mongodb_users import
|
|
31
|
+
from single_kernel_mongo.utils.mongodb_users import (
|
|
32
|
+
CharmedBackupUser,
|
|
33
|
+
CharmedLogRotateUser,
|
|
34
|
+
CharmedStatsUser,
|
|
35
|
+
)
|
|
32
36
|
from single_kernel_mongo.workload import (
|
|
33
37
|
get_logrotate_workload_for_substrate,
|
|
34
38
|
get_mongodb_exporter_workload_for_substrate,
|
|
@@ -135,7 +139,7 @@ class BackupConfigManager(CommonConfigManager):
|
|
|
135
139
|
logger.info("Not starting PBM yet. Shard not added to config-server")
|
|
136
140
|
return
|
|
137
141
|
|
|
138
|
-
if not self.state.get_user_password(
|
|
142
|
+
if not self.state.get_user_password(CharmedBackupUser):
|
|
139
143
|
logger.info("No password found.")
|
|
140
144
|
return
|
|
141
145
|
|
|
@@ -184,7 +188,7 @@ class LogRotateConfigManager(CommonConfigManager):
|
|
|
184
188
|
logger.info("DB is not initialised.")
|
|
185
189
|
return
|
|
186
190
|
|
|
187
|
-
if not self.state.get_user_password(
|
|
191
|
+
if not self.state.get_user_password(CharmedLogRotateUser):
|
|
188
192
|
logger.info("No password found.")
|
|
189
193
|
return
|
|
190
194
|
|
|
@@ -224,17 +228,17 @@ class MongoDBExporterConfigManager(CommonConfigManager):
|
|
|
224
228
|
|
|
225
229
|
@override
|
|
226
230
|
def build_parameters(self) -> list[list[str]]:
|
|
227
|
-
return [[self.state.
|
|
231
|
+
return [[self.state.stats_config.uri]]
|
|
228
232
|
|
|
229
233
|
def configure_and_restart(self):
|
|
230
234
|
"""Exposes the endpoint to mongodb_exporter."""
|
|
231
235
|
if not self.state.db_initialised:
|
|
232
236
|
return
|
|
233
237
|
|
|
234
|
-
if not self.state.get_user_password(
|
|
238
|
+
if not self.state.get_user_password(CharmedStatsUser):
|
|
235
239
|
return
|
|
236
240
|
|
|
237
|
-
if not self.workload.active() or self.get_environment() != self.state.
|
|
241
|
+
if not self.workload.active() or self.get_environment() != self.state.stats_config.uri:
|
|
238
242
|
try:
|
|
239
243
|
# Always enable the service
|
|
240
244
|
self.workload.stop()
|
|
@@ -52,11 +52,11 @@ from single_kernel_mongo.utils.mongo_config import (
|
|
|
52
52
|
from single_kernel_mongo.utils.mongo_connection import MongoConnection, NotReadyError
|
|
53
53
|
from single_kernel_mongo.utils.mongodb_users import (
|
|
54
54
|
OPERATOR_ROLE,
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
CharmedBackupUser,
|
|
56
|
+
CharmedLogRotateUser,
|
|
57
|
+
CharmedOperatorUser,
|
|
58
|
+
CharmedStatsUser,
|
|
57
59
|
MongoDBUser,
|
|
58
|
-
MonitorUser,
|
|
59
|
-
OperatorUser,
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
if TYPE_CHECKING:
|
|
@@ -138,12 +138,12 @@ class MongoManager(Object, ManagerStatusProtocol):
|
|
|
138
138
|
|
|
139
139
|
def initialise_charm_admin_users(self) -> None:
|
|
140
140
|
"""First initialisation of each user."""
|
|
141
|
-
self.
|
|
142
|
-
self.initialise_user(
|
|
143
|
-
self.initialise_user(
|
|
144
|
-
self.initialise_user(
|
|
141
|
+
self.initialise_charmed_operator_user()
|
|
142
|
+
self.initialise_user(CharmedStatsUser)
|
|
143
|
+
self.initialise_user(CharmedBackupUser)
|
|
144
|
+
self.initialise_user(CharmedLogRotateUser)
|
|
145
145
|
|
|
146
|
-
def
|
|
146
|
+
def initialise_charmed_operator_user(self):
|
|
147
147
|
"""Creates initial admin user for MongoDB.
|
|
148
148
|
|
|
149
149
|
Initial admin user can be created only through localhost connection.
|
|
@@ -154,7 +154,7 @@ class MongoManager(Object, ManagerStatusProtocol):
|
|
|
154
154
|
It is needed to install mongodb-clients inside charm container to make
|
|
155
155
|
this function work correctly.
|
|
156
156
|
"""
|
|
157
|
-
if self.state.app_peer_data.is_user_created(
|
|
157
|
+
if self.state.app_peer_data.is_user_created(CharmedOperatorUser.username):
|
|
158
158
|
return
|
|
159
159
|
config = self.state.mongo_config
|
|
160
160
|
cmd = [
|
|
@@ -169,7 +169,7 @@ class MongoManager(Object, ManagerStatusProtocol):
|
|
|
169
169
|
'})"',
|
|
170
170
|
]
|
|
171
171
|
self.workload.run_bin_command("mongodb://localhost/admin", cmd, input=config.password)
|
|
172
|
-
self.state.app_peer_data.set_user_created(
|
|
172
|
+
self.state.app_peer_data.set_user_created(CharmedOperatorUser.username)
|
|
173
173
|
|
|
174
174
|
def initialise_user(self, user: MongoDBUser):
|
|
175
175
|
"""Creates a user and sets its role on the MongoDB database."""
|
|
@@ -100,12 +100,12 @@ from single_kernel_mongo.state.charm_state import CharmState
|
|
|
100
100
|
from single_kernel_mongo.utils.helpers import is_valid_ldap_options, is_valid_ldapusertodnmapping
|
|
101
101
|
from single_kernel_mongo.utils.mongo_connection import MongoConnection, NotReadyError
|
|
102
102
|
from single_kernel_mongo.utils.mongodb_users import (
|
|
103
|
-
|
|
103
|
+
CharmedBackupUser,
|
|
104
|
+
CharmedLogRotateUser,
|
|
105
|
+
CharmedOperatorUser,
|
|
106
|
+
CharmedStatsUser,
|
|
104
107
|
InternalUsers,
|
|
105
|
-
LogRotateUser,
|
|
106
108
|
MongoDBUser,
|
|
107
|
-
MonitorUser,
|
|
108
|
-
OperatorUser,
|
|
109
109
|
get_user_from_username,
|
|
110
110
|
validate_charm_user_password_config,
|
|
111
111
|
)
|
|
@@ -719,10 +719,10 @@ class MongoDBOperator(OperatorProtocol, Object):
|
|
|
719
719
|
|
|
720
720
|
Adds the unit as a replica to the MongoDB replica set.
|
|
721
721
|
"""
|
|
722
|
-
# Changing the
|
|
723
|
-
# units receiving a relation changed event. We must update
|
|
724
|
-
# and pbm URI if the password changes so that COS/pbm can
|
|
725
|
-
# work.
|
|
722
|
+
# Changing the charmed-stats or the charmed-backup password will lead
|
|
723
|
+
# to non-leader units receiving a relation changed event. We must update
|
|
724
|
+
# the monitor and pbm URI if the password changes so that COS/pbm can
|
|
725
|
+
# continue to work.
|
|
726
726
|
if self.state.db_initialised and self.workload.active():
|
|
727
727
|
self.mongodb_exporter_config_manager.configure_and_restart()
|
|
728
728
|
self.backup_manager.configure_and_restart()
|
|
@@ -912,16 +912,18 @@ class MongoDBOperator(OperatorProtocol, Object):
|
|
|
912
912
|
def update_single_user_password(self, user: MongoDBUser, new_password: str) -> None:
|
|
913
913
|
"""Set password in Mongod and restart the appropriate services."""
|
|
914
914
|
self.mongo_manager.set_user_password(user, new_password)
|
|
915
|
-
if user ==
|
|
915
|
+
if user == CharmedBackupUser:
|
|
916
916
|
# Update and restart PBM Agent.
|
|
917
917
|
self.backup_manager.configure_and_restart()
|
|
918
|
-
if user ==
|
|
918
|
+
if user == CharmedStatsUser:
|
|
919
919
|
# Update and restart mongodb exporter.
|
|
920
920
|
self.mongodb_exporter_config_manager.configure_and_restart()
|
|
921
|
-
if user ==
|
|
921
|
+
if user == CharmedLogRotateUser:
|
|
922
922
|
# Update and restart logrotate.
|
|
923
923
|
self.logrotate_config_manager.configure_and_restart()
|
|
924
|
-
if user in (
|
|
924
|
+
if user in (CharmedOperatorUser, CharmedBackupUser) and self.state.is_role(
|
|
925
|
+
MongoDBRoles.CONFIG_SERVER
|
|
926
|
+
):
|
|
925
927
|
self.config_server_manager.update_credentials(
|
|
926
928
|
user.password_key_name,
|
|
927
929
|
new_password,
|
|
@@ -62,9 +62,9 @@ from single_kernel_mongo.state.tls_state import SECRET_CA_LABEL
|
|
|
62
62
|
from single_kernel_mongo.utils.mongo_connection import MongoConnection, NotReadyError
|
|
63
63
|
from single_kernel_mongo.utils.mongo_error_codes import MongoErrorCodes
|
|
64
64
|
from single_kernel_mongo.utils.mongodb_users import (
|
|
65
|
-
|
|
65
|
+
CharmedBackupUser,
|
|
66
|
+
CharmedOperatorUser,
|
|
66
67
|
MongoDBUser,
|
|
67
|
-
OperatorUser,
|
|
68
68
|
)
|
|
69
69
|
from single_kernel_mongo.workload.mongodb_workload import MongoDBWorkload
|
|
70
70
|
|
|
@@ -108,10 +108,10 @@ class ConfigServerManager(Object, ManagerStatusProtocol):
|
|
|
108
108
|
)
|
|
109
109
|
relation_data = {
|
|
110
110
|
AppShardingComponentKeys.OPERATOR_PASSWORD.value: self.state.get_user_password(
|
|
111
|
-
|
|
111
|
+
CharmedOperatorUser
|
|
112
112
|
),
|
|
113
113
|
AppShardingComponentKeys.BACKUP_PASSWORD.value: self.state.get_user_password(
|
|
114
|
-
|
|
114
|
+
CharmedBackupUser
|
|
115
115
|
),
|
|
116
116
|
AppShardingComponentKeys.KEY_FILE.value: self.state.get_keyfile(),
|
|
117
117
|
AppShardingComponentKeys.HOST.value: json.dumps(sorted(self.state.internal_hosts)),
|
|
@@ -476,8 +476,8 @@ class ConfigServerManager(Object, ManagerStatusProtocol):
|
|
|
476
476
|
if not hosts:
|
|
477
477
|
return unreachable_hosts
|
|
478
478
|
|
|
479
|
-
# use a URI that is not dependent on the operator password, as we are
|
|
480
|
-
# that the shard has received the password yet.
|
|
479
|
+
# use a URI that is not dependent on the charmed-operator password, as we are
|
|
480
|
+
# not guaranteed that the shard has received the password yet.
|
|
481
481
|
# To check if the shard is ready, we check the entire replica set for readiness
|
|
482
482
|
uri = f"mongodb://{','.join(hosts)}"
|
|
483
483
|
if not self.dependent.mongo_manager.mongod_ready(uri, direct=False):
|
|
@@ -637,7 +637,7 @@ class ShardManager(Object, ManagerStatusProtocol):
|
|
|
637
637
|
self.state.app_peer_data.mongos_hosts = self.state.shard_state.mongos_hosts
|
|
638
638
|
|
|
639
639
|
def handle_secret_changed(self, secret_label: str | None) -> None:
|
|
640
|
-
"""Update operator and backup user passwords when rotation occurs.
|
|
640
|
+
"""Update charmed-operator and charmed-backup user passwords when rotation occurs.
|
|
641
641
|
|
|
642
642
|
Changes in secrets do not re-trigger a relation changed event, so it is necessary to listen
|
|
643
643
|
to secret changes events.
|
|
@@ -665,7 +665,9 @@ class ShardManager(Object, ManagerStatusProtocol):
|
|
|
665
665
|
backup_password = self.state.shard_state.backup_password
|
|
666
666
|
|
|
667
667
|
if not operator_password or not backup_password:
|
|
668
|
-
raise WaitingForSecretsError(
|
|
668
|
+
raise WaitingForSecretsError(
|
|
669
|
+
"Missing charmed-operator password or charmed-backup password"
|
|
670
|
+
)
|
|
669
671
|
self.sync_cluster_passwords(operator_password, backup_password)
|
|
670
672
|
|
|
671
673
|
# Add the certificate if it is present
|
|
@@ -764,7 +766,10 @@ class ShardManager(Object, ManagerStatusProtocol):
|
|
|
764
766
|
)
|
|
765
767
|
raise NotReadyError
|
|
766
768
|
|
|
767
|
-
for user, password in (
|
|
769
|
+
for user, password in (
|
|
770
|
+
(CharmedOperatorUser, operator_password),
|
|
771
|
+
(CharmedBackupUser, backup_password),
|
|
772
|
+
):
|
|
768
773
|
try:
|
|
769
774
|
self.update_password(user=user, new_password=password)
|
|
770
775
|
except SetPasswordError:
|
|
@@ -888,7 +893,7 @@ class ShardManager(Object, ManagerStatusProtocol):
|
|
|
888
893
|
)
|
|
889
894
|
return False
|
|
890
895
|
|
|
891
|
-
config = self.state.mongos_config_for_user(
|
|
896
|
+
config = self.state.mongos_config_for_user(CharmedOperatorUser, set(mongos_hosts))
|
|
892
897
|
|
|
893
898
|
drained = shard_name not in self.dependent.mongo_manager.get_draining_shards(
|
|
894
899
|
config=config, shard_name=shard_name
|
|
@@ -927,9 +932,13 @@ class ShardManager(Object, ManagerStatusProtocol):
|
|
|
927
932
|
|
|
928
933
|
def should_synchronise_cluster_passwords(self) -> bool:
|
|
929
934
|
"""Decides if we should synchronise cluster passwords or not."""
|
|
930
|
-
if self.state.shard_state.operator_password != self.state.get_user_password(
|
|
935
|
+
if self.state.shard_state.operator_password != self.state.get_user_password(
|
|
936
|
+
CharmedOperatorUser
|
|
937
|
+
):
|
|
931
938
|
return True
|
|
932
|
-
if self.state.shard_state.backup_password != self.state.get_user_password(
|
|
939
|
+
if self.state.shard_state.backup_password != self.state.get_user_password(
|
|
940
|
+
CharmedBackupUser
|
|
941
|
+
):
|
|
933
942
|
return True
|
|
934
943
|
return False
|
|
935
944
|
|
|
@@ -18,7 +18,7 @@ from single_kernel_mongo.exceptions import (
|
|
|
18
18
|
from single_kernel_mongo.state.charm_state import CharmState
|
|
19
19
|
from single_kernel_mongo.utils.mongo_config import MongoConfiguration
|
|
20
20
|
from single_kernel_mongo.utils.mongo_connection import MongoConnection
|
|
21
|
-
from single_kernel_mongo.utils.mongodb_users import
|
|
21
|
+
from single_kernel_mongo.utils.mongodb_users import CharmedOperatorUser
|
|
22
22
|
|
|
23
23
|
logger = logging.getLogger()
|
|
24
24
|
|
|
@@ -93,7 +93,7 @@ class MongoDBUpgradesManager:
|
|
|
93
93
|
self.state.mongos_config
|
|
94
94
|
if self.state.is_role(MongoDBRoles.CONFIG_SERVER)
|
|
95
95
|
else self.state.mongos_config_for_user(
|
|
96
|
-
|
|
96
|
+
CharmedOperatorUser, hosts=set(self.state.shard_state.mongos_hosts)
|
|
97
97
|
)
|
|
98
98
|
)
|
|
99
99
|
|
|
@@ -142,7 +142,7 @@ class MongoDBUpgradesManager:
|
|
|
142
142
|
config_server_hosts = self.state.app_peer_data.mongos_hosts
|
|
143
143
|
mongodb_configurations = [
|
|
144
144
|
self.state.mongodb_config_for_user(
|
|
145
|
-
|
|
145
|
+
CharmedOperatorUser,
|
|
146
146
|
hosts=set(config_server_hosts),
|
|
147
147
|
replset=self.state.config_server_name,
|
|
148
148
|
)
|
|
@@ -163,7 +163,7 @@ class MongoDBUpgradesManager:
|
|
|
163
163
|
shard_hosts = shard_entry["host"].split("/")[1]
|
|
164
164
|
parsed_ips = {host.split(":")[0] for host in shard_hosts.split(",")}
|
|
165
165
|
return self.state.mongodb_config_for_user(
|
|
166
|
-
|
|
166
|
+
CharmedOperatorUser, parsed_ips, replset=shard_entry[SHARD_NAME_INDEX]
|
|
167
167
|
)
|
|
168
168
|
|
|
169
169
|
def get_random_write_and_collection(self) -> tuple[str, str, str]:
|
|
@@ -400,7 +400,7 @@ class MongoDBUpgradesManager:
|
|
|
400
400
|
for replica_set_config in self.get_all_replica_set_configs_in_cluster(mongos_config):
|
|
401
401
|
for single_host in replica_set_config.hosts:
|
|
402
402
|
single_replica_config = self.state.mongodb_config_for_user(
|
|
403
|
-
|
|
403
|
+
CharmedOperatorUser,
|
|
404
404
|
hosts={single_host},
|
|
405
405
|
replset=replica_set_config.replset,
|
|
406
406
|
standalone=True,
|
|
@@ -426,7 +426,7 @@ class MongoDBUpgradesManager:
|
|
|
426
426
|
config = self.state.mongo_config
|
|
427
427
|
for host in config.hosts:
|
|
428
428
|
single_unit_config = self.state.mongodb_config_for_user(
|
|
429
|
-
|
|
429
|
+
CharmedOperatorUser, hosts={host}, replset=config.replset, standalone=True
|
|
430
430
|
)
|
|
431
431
|
with MongoConnection(single_unit_config) as mongod:
|
|
432
432
|
version = mongod.client.admin.command(
|
|
@@ -73,12 +73,12 @@ from single_kernel_mongo.utils.mongo_config import MongoConfiguration
|
|
|
73
73
|
from single_kernel_mongo.utils.mongo_connection import MongoConnection
|
|
74
74
|
from single_kernel_mongo.utils.mongo_error_codes import MongoErrorCodes
|
|
75
75
|
from single_kernel_mongo.utils.mongodb_users import (
|
|
76
|
-
|
|
76
|
+
CharmedBackupUser,
|
|
77
|
+
CharmedLogRotateUser,
|
|
78
|
+
CharmedOperatorUser,
|
|
79
|
+
CharmedStatsUser,
|
|
77
80
|
InternalUsers,
|
|
78
|
-
LogRotateUser,
|
|
79
81
|
MongoDBUser,
|
|
80
|
-
MonitorUser,
|
|
81
|
-
OperatorUser,
|
|
82
82
|
RoleNames,
|
|
83
83
|
)
|
|
84
84
|
|
|
@@ -725,35 +725,35 @@ class CharmState(Object, StatusesStateProtocol):
|
|
|
725
725
|
|
|
726
726
|
@property
|
|
727
727
|
def backup_config(self) -> MongoConfiguration:
|
|
728
|
-
"""Mongo Configuration for the backup user."""
|
|
729
|
-
return self.mongodb_config_for_user(
|
|
728
|
+
"""Mongo Configuration for the charmed-backup user."""
|
|
729
|
+
return self.mongodb_config_for_user(CharmedBackupUser, standalone=True)
|
|
730
730
|
|
|
731
731
|
@property
|
|
732
|
-
def
|
|
733
|
-
"""Mongo Configuration for the
|
|
734
|
-
return self.mongodb_config_for_user(
|
|
732
|
+
def stats_config(self) -> MongoConfiguration:
|
|
733
|
+
"""Mongo Configuration for the charmed-stats user."""
|
|
734
|
+
return self.mongodb_config_for_user(CharmedStatsUser, hosts=self.internal_hosts)
|
|
735
735
|
|
|
736
736
|
@property
|
|
737
737
|
def logrotate_config(self) -> MongoConfiguration:
|
|
738
|
-
"""Mongo Configuration for the logrotate user."""
|
|
739
|
-
return self.mongodb_config_for_user(
|
|
738
|
+
"""Mongo Configuration for the charmed-logrotate user."""
|
|
739
|
+
return self.mongodb_config_for_user(CharmedLogRotateUser, standalone=True)
|
|
740
740
|
|
|
741
741
|
@property
|
|
742
742
|
def operator_config(self) -> MongoConfiguration:
|
|
743
|
-
"""Mongo Configuration for the operator user."""
|
|
744
|
-
return self.mongodb_config_for_user(
|
|
743
|
+
"""Mongo Configuration for the charmed-operator user."""
|
|
744
|
+
return self.mongodb_config_for_user(CharmedOperatorUser, hosts=self.internal_hosts)
|
|
745
745
|
|
|
746
746
|
@property
|
|
747
747
|
def remote_mongos_config(self) -> MongoConfiguration:
|
|
748
748
|
"""Mongos Configuration for the remote mongos server."""
|
|
749
749
|
mongos_hosts = self.app_peer_data.mongos_hosts
|
|
750
|
-
return self.mongos_config_for_user(
|
|
750
|
+
return self.mongos_config_for_user(CharmedOperatorUser, set(mongos_hosts))
|
|
751
751
|
|
|
752
752
|
@property
|
|
753
753
|
def mongos_config(self) -> MongoConfiguration:
|
|
754
754
|
"""Mongos Configuration for the admin mongos user."""
|
|
755
755
|
if self.charm_role.name == CharmKind.MONGOD:
|
|
756
|
-
return self.mongos_config_for_user(
|
|
756
|
+
return self.mongos_config_for_user(CharmedOperatorUser, self.internal_hosts)
|
|
757
757
|
username, password = self.get_user_credentials()
|
|
758
758
|
database = self.app_peer_data.database
|
|
759
759
|
port: int | None = MongoPorts.MONGOS_PORT.value
|
|
@@ -18,8 +18,8 @@ class AppShardingComponentKeys(str, Enum):
|
|
|
18
18
|
"""Config Server State Model for the application."""
|
|
19
19
|
|
|
20
20
|
DATABASE = "database"
|
|
21
|
-
OPERATOR_PASSWORD = "operator-password"
|
|
22
|
-
BACKUP_PASSWORD = "backup-password"
|
|
21
|
+
OPERATOR_PASSWORD = "charmed-operator-password"
|
|
22
|
+
BACKUP_PASSWORD = "charmed-backup-password"
|
|
23
23
|
HOST = "host"
|
|
24
24
|
KEY_FILE = "key-file"
|
|
25
25
|
INT_CA_SECRET = "int-ca-secret"
|
|
@@ -32,8 +32,8 @@ class AppShardingComponentKeys(str, Enum):
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
SECRETS_FIELDS = [
|
|
35
|
-
"operator-password",
|
|
36
|
-
"backup-password",
|
|
35
|
+
"charmed-operator-password",
|
|
36
|
+
"charmed-backup-password",
|
|
37
37
|
"key-file",
|
|
38
38
|
"int-ca-secret",
|
|
39
39
|
"ext-ca-secret",
|
|
@@ -93,14 +93,14 @@ class AppShardingComponentState(AbstractRelationState[Data]):
|
|
|
93
93
|
|
|
94
94
|
@property
|
|
95
95
|
def operator_password(self) -> str | None:
|
|
96
|
-
"""Returns the operator password."""
|
|
96
|
+
"""Returns the charmed-operator password."""
|
|
97
97
|
if not self.relation:
|
|
98
98
|
return None
|
|
99
99
|
return self.relation_data.get(AppShardingComponentKeys.OPERATOR_PASSWORD.value, None)
|
|
100
100
|
|
|
101
101
|
@property
|
|
102
102
|
def backup_password(self) -> str | None:
|
|
103
|
-
"""Returns the
|
|
103
|
+
"""Returns the charmed-backup password."""
|
|
104
104
|
if not self.relation:
|
|
105
105
|
return None
|
|
106
106
|
return self.relation_data.get(AppShardingComponentKeys.BACKUP_PASSWORD.value, None)
|
|
@@ -129,14 +129,14 @@ class MongoDBUser(BaseModel):
|
|
|
129
129
|
return self.hosts
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
username=InternalUsernames.
|
|
132
|
+
CharmedOperatorUser = MongoDBUser(
|
|
133
|
+
username=InternalUsernames.CHARMED_OPERATOR,
|
|
134
134
|
database_name=SystemDBS.ADMIN,
|
|
135
135
|
roles={RoleNames.DEFAULT},
|
|
136
136
|
)
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
username=InternalUsernames.
|
|
138
|
+
CharmedStatsUser = MongoDBUser(
|
|
139
|
+
username=InternalUsernames.CHARMED_STATS,
|
|
140
140
|
database_name=SystemDBS.ADMIN,
|
|
141
141
|
roles={RoleNames.MONITOR},
|
|
142
142
|
privileges={
|
|
@@ -154,16 +154,16 @@ MonitorUser = MongoDBUser(
|
|
|
154
154
|
hosts={LOCALHOST}, # MongoDB Exporter can only connect to one replica.
|
|
155
155
|
)
|
|
156
156
|
|
|
157
|
-
|
|
158
|
-
username=InternalUsernames.
|
|
157
|
+
CharmedBackupUser = MongoDBUser(
|
|
158
|
+
username=InternalUsernames.CHARMED_BACKUP,
|
|
159
159
|
roles={RoleNames.BACKUP},
|
|
160
160
|
privileges={"resource": {"anyResource": True}, "actions": ["anyAction"]},
|
|
161
161
|
mongodb_role="pbmAnyAction",
|
|
162
162
|
hosts={LOCALHOST}, # pbm cannot make a direct connection if multiple hosts are used
|
|
163
163
|
)
|
|
164
164
|
|
|
165
|
-
|
|
166
|
-
username=InternalUsernames.
|
|
165
|
+
CharmedLogRotateUser = MongoDBUser(
|
|
166
|
+
username=InternalUsernames.CHARMED_LOGROTATE,
|
|
167
167
|
database_name=SystemDBS.ADMIN,
|
|
168
168
|
roles={RoleNames.LOGROTATE},
|
|
169
169
|
privileges={"resource": {"cluster": True}, "actions": ["logRotate"]},
|
|
@@ -172,10 +172,10 @@ LogRotateUser = MongoDBUser(
|
|
|
172
172
|
)
|
|
173
173
|
|
|
174
174
|
InternalUsers = (
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
175
|
+
CharmedOperatorUser,
|
|
176
|
+
CharmedBackupUser,
|
|
177
|
+
CharmedStatsUser,
|
|
178
|
+
CharmedLogRotateUser,
|
|
179
179
|
)
|
|
180
180
|
|
|
181
181
|
|
|
@@ -185,14 +185,14 @@ def get_user_from_username(username: str) -> MongoDBUser:
|
|
|
185
185
|
Raises:
|
|
186
186
|
ValueError: If the username is not one of the known users.
|
|
187
187
|
"""
|
|
188
|
-
if username ==
|
|
189
|
-
return
|
|
190
|
-
if username ==
|
|
191
|
-
return
|
|
192
|
-
if username ==
|
|
193
|
-
return
|
|
194
|
-
if username ==
|
|
195
|
-
return
|
|
188
|
+
if username == CharmedOperatorUser.username:
|
|
189
|
+
return CharmedOperatorUser
|
|
190
|
+
if username == CharmedStatsUser.username:
|
|
191
|
+
return CharmedStatsUser
|
|
192
|
+
if username == CharmedBackupUser.username:
|
|
193
|
+
return CharmedBackupUser
|
|
194
|
+
if username == CharmedLogRotateUser.username:
|
|
195
|
+
return CharmedLogRotateUser
|
|
196
196
|
raise ValueError(f"Unknown user: {username}")
|
|
197
197
|
|
|
198
198
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|