mysqloperator/controller/backup/meb_cert.py (43 lines of code) (raw):
# Copyright (c) 2025, Oracle and/or its affiliates.
#
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
#
import base64
import os
import subprocess
import tempfile
def _run(cmd):
subprocess.run(cmd, check=True)
def prepare_meb_tls_secret(spec: 'InnoDBClusterSpec') -> dict:
"""Create Certificates
this is only used internally and checked against our CA"""
with tempfile.TemporaryDirectory() as tmpdir:
# create CA
_run(["openssl", "genrsa", "-out", f"{tmpdir}/ca.key", "2048"])
_run(["openssl", "req", "-x509", "-new", "-nodes", "-key",
f"{tmpdir}/ca.key", "-sha256", "-days", "365",
"-out", f"{tmpdir}/ca.pem",
"-subj", "/C=AU/ST=Some-State/O=My CA/CN=MySQLOperatorRoot"])
_run(["openssl", "genrsa", "-out", f"{tmpdir}/client.key", "2048"])
_run(["openssl", "req", "-new", "-key", f"{tmpdir}/client.key",
"-out", f"{tmpdir}/client.csr",
"-subj", f"/C=AU/ST=None/O=MySQLOperator/CN=backupclient"])
_run(["openssl", "x509", "-req", "-in", f"{tmpdir}/client.csr",
"-CA", f"{tmpdir}/ca.pem", "-CAkey", f"{tmpdir}/ca.key",
"-CAcreateserial", "-out", f"{tmpdir}/client.pem",
"-days", "365", "-sha256"])
secret_data = {}
for filename in os.listdir(tmpdir):
full_path = os.path.join(tmpdir, filename)
if os.path.isfile(full_path):
with open(full_path, "rb") as f:
content = f.read()
secret_data[filename] = base64.b64encode(content).decode('ascii')
secret = {
"apiVersion": "v1",
"kind": "Secret",
"metadata": {
"name": spec.name+"-meb-tls",
"tier": "mysql",
"mysql.oracle.com/cluster": spec.name,
"app.kubernetes.io/name": "mysql-innodbcluster",
"app.kubernetes.io/instance": f"idc-{spec.name}",
"app.kubernetes.io/managed-by": "mysql-operator",
"app.kubernetes.io/created-by": "mysql-operator"
},
"data": secret_data
}
return secret