Skip to content

Commit 7897bfc

Browse files
authored
[MISC] Conditional checksum calculation (#812)
* Bump boto * Conditional checksum calculation
1 parent 852d80c commit 7897bfc

File tree

4 files changed

+90
-70
lines changed

4 files changed

+90
-70
lines changed

poetry.lock

Lines changed: 37 additions & 37 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ requires-poetry = ">=2.0.0"
88
[tool.poetry.dependencies]
99
python = "^3.10"
1010
ops = "^2.18.1"
11-
boto3 = "^1.35.99"
11+
boto3 = "^1.37.22"
1212
pgconnstr = "^1.0.1"
1313
requests = "^2.32.3"
1414
tenacity = "^9.0.0"

src/backups.py

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,23 @@ def _tls_ca_chain_filename(self) -> str:
100100
return f"{self.charm._storage_path}/pgbackrest-tls-ca-chain.crt"
101101
return ""
102102

103+
def _get_s3_session_resource(self, s3_parameters: dict):
104+
session = boto3.session.Session(
105+
aws_access_key_id=s3_parameters["access-key"],
106+
aws_secret_access_key=s3_parameters["secret-key"],
107+
region_name=s3_parameters["region"],
108+
)
109+
return session.resource(
110+
"s3",
111+
endpoint_url=self._construct_endpoint(s3_parameters),
112+
verify=(self._tls_ca_chain_filename or None),
113+
config=botocore.client.Config(
114+
# https://github.com/boto/boto3/issues/4400#issuecomment-2600742103
115+
request_checksum_calculation="when_required",
116+
response_checksum_validation="when_required",
117+
),
118+
)
119+
103120
def _are_backup_settings_ok(self) -> tuple[bool, str | None]:
104121
"""Validates whether backup settings are OK."""
105122
if self.model.get_relation(self.relation_name) is None:
@@ -258,18 +275,9 @@ def _create_bucket_if_not_exists(self) -> None:
258275

259276
bucket_name = s3_parameters["bucket"]
260277
region = s3_parameters.get("region")
261-
session = boto3.session.Session(
262-
aws_access_key_id=s3_parameters["access-key"],
263-
aws_secret_access_key=s3_parameters["secret-key"],
264-
region_name=s3_parameters["region"],
265-
)
266278

267279
try:
268-
s3 = session.resource(
269-
"s3",
270-
endpoint_url=self._construct_endpoint(s3_parameters),
271-
verify=(self._tls_ca_chain_filename or None),
272-
)
280+
s3 = self._get_s3_session_resource(s3_parameters)
273281
except ValueError as e:
274282
logger.exception("Failed to create a session '%s' in region=%s.", bucket_name, region)
275283
raise e
@@ -1372,17 +1380,7 @@ def _upload_content_to_s3(
13721380
processed_s3_path = os.path.join(s3_parameters["path"], s3_path).lstrip("/")
13731381
try:
13741382
logger.info(f"Uploading content to bucket={bucket_name}, path={processed_s3_path}")
1375-
session = boto3.session.Session(
1376-
aws_access_key_id=s3_parameters["access-key"],
1377-
aws_secret_access_key=s3_parameters["secret-key"],
1378-
region_name=s3_parameters["region"],
1379-
)
1380-
1381-
s3 = session.resource(
1382-
"s3",
1383-
endpoint_url=self._construct_endpoint(s3_parameters),
1384-
verify=(self._tls_ca_chain_filename or None),
1385-
)
1383+
s3 = self._get_s3_session_resource(s3_parameters)
13861384
bucket = s3.Bucket(bucket_name)
13871385

13881386
with tempfile.NamedTemporaryFile() as temp_file:
@@ -1415,16 +1413,7 @@ def _read_content_from_s3(self, s3_path: str, s3_parameters: dict) -> str | None
14151413
processed_s3_path = os.path.join(s3_parameters["path"], s3_path).lstrip("/")
14161414
try:
14171415
logger.info(f"Reading content from bucket={bucket_name}, path={processed_s3_path}")
1418-
session = boto3.session.Session(
1419-
aws_access_key_id=s3_parameters["access-key"],
1420-
aws_secret_access_key=s3_parameters["secret-key"],
1421-
region_name=s3_parameters["region"],
1422-
)
1423-
s3 = session.resource(
1424-
"s3",
1425-
endpoint_url=self._construct_endpoint(s3_parameters),
1426-
verify=(self._tls_ca_chain_filename or None),
1427-
)
1416+
s3 = self._get_s3_session_resource(s3_parameters)
14281417
bucket = s3.Bucket(bucket_name)
14291418
with BytesIO() as buf:
14301419
bucket.download_fileobj(processed_s3_path, buf)

0 commit comments

Comments
 (0)