Skip to content

Commit 528121c

Browse files
authored
Add support for s3 tls-ca-chain (#396)
* Add support for s3 tls-ca-chain Fixes #395 Signed-off-by: Peter Sabaini <peter.sabaini@canonical.com> * Bump libpatch as base64 is added Per review feedback Signed-off-by: Peter Sabaini <peter.sabaini@canonical.com> * Ensure ca_file is closed Signed-off-by: Peter Sabaini <peter.sabaini@canonical.com> --------- Signed-off-by: Peter Sabaini <peter.sabaini@canonical.com>
1 parent 53e5474 commit 528121c

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

lib/charms/mysql/v0/s3_helpers.py

+18-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414

1515
"""S3 helper functions for the MySQL charms."""
16-
16+
import base64
1717
import logging
1818
import tempfile
1919
import time
@@ -31,7 +31,7 @@
3131

3232
# Increment this PATCH version before using `charmcraft publish-lib` or reset
3333
# to 0 if you are raising the major API version
34-
LIBPATCH = 6
34+
LIBPATCH = 7
3535

3636
# botocore/urllib3 clutter the logs when on debug
3737
logging.getLogger("botocore").setLevel(logging.WARNING)
@@ -52,13 +52,25 @@ def upload_content_to_s3(content: str, content_path: str, s3_parameters: Dict) -
5252
"""
5353
try:
5454
logger.info(f"Uploading content to bucket={s3_parameters['bucket']}, path={content_path}")
55+
ca_file = tempfile.NamedTemporaryFile()
5556
session = boto3.session.Session(
5657
aws_access_key_id=s3_parameters["access-key"],
5758
aws_secret_access_key=s3_parameters["secret-key"],
5859
region_name=s3_parameters["region"] or None,
5960
)
60-
61-
s3 = session.resource("s3", endpoint_url=s3_parameters["endpoint"])
61+
verif = True
62+
ca_chain = s3_parameters["tls-ca-chain"]
63+
if ca_chain:
64+
ca = "\n".join([base64.b64decode(s).decode() for s in ca_chain])
65+
ca_file.write(ca.encode())
66+
ca_file.flush()
67+
verif = ca_file.name
68+
69+
s3 = session.resource(
70+
"s3",
71+
endpoint_url=s3_parameters["endpoint"],
72+
verify=verif,
73+
)
6274

6375
bucket = s3.Bucket(s3_parameters["bucket"])
6476

@@ -73,6 +85,8 @@ def upload_content_to_s3(content: str, content_path: str, s3_parameters: Dict) -
7385
exc_info=e,
7486
)
7587
return False
88+
finally:
89+
ca_file.close()
7690

7791
return True
7892

tests/unit/test_backups.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,20 @@ def test_retrieve_s3_parameters(self, _get_s3_connection_info):
5454
"bucket": "test_bucket",
5555
"access-key": "test-access-key",
5656
"secret-key": "test-secret-key",
57+
"tls-ca-chain": ["Zm9vYmFy"], # "foobar" in base64
5758
}
5859
_get_s3_connection_info.return_value = return_value
5960

6061
s3_parameters, missing_required_parameters = self.mysql_backups._retrieve_s3_parameters()
6162
self.assertEqual(
6263
s3_parameters,
63-
{"endpoint": "https://s3.amazonaws.com", "region": None, "path": "", **return_value},
64+
{
65+
"endpoint": "https://s3.amazonaws.com",
66+
"region": None,
67+
"path": "",
68+
"tls-ca-chain": "foobar",
69+
**return_value,
70+
},
6471
)
6572
self.assertEqual(missing_required_parameters, [])
6673

0 commit comments

Comments
 (0)