in mysqloperator/controller/innodbcluster/operator_cluster.py [0:0]
def on_innodbcluster_read_replicas_changed(old: dict, new: dict, body: Body,
logger: Logger, **kwargs):
logger.info("on_innodbcluster_read_replicas_changed")
if old == new:
return
cluster = InnoDBCluster(body)
if not cluster.get_create_time():
raise kopf.TemporaryError("The cluster is not ready. Will retry", delay=30)
cluster.parsed_spec.validate(logger)
if old is None:
old = []
if new is None:
new = []
with ClusterMutex(cluster):
# Remove read replica sets which were removed
for rr in old:
if rr['name'] not in map(lambda nrr: nrr['name'], new):
cluster_objects.remove_read_replica(cluster, rr)
# Add or update read replica sets
for rr in new:
old_rr = next(filter(lambda orr: orr['name'] == rr['name'], old), None)
rrspec = cluster.parsed_spec.get_read_replica(rr['name'])
if rrspec is None:
# This should never happen except maybe a very short race
# when user adds it and immediateyl removes or in a retry
# loop. But in all those cases its removed after adding,
# thus not creating is fine
logger.warn(f"Could not find Spec for ReadReplica {rr['name']} in InnoDBCluster")
continue
if old_rr == rr:
# no change
pass
elif old_rr:
# Old Read Replica -> Update
do_reconcile_read_replica(cluster, rrspec, logger)
else:
# New Read Replica -> Create it
do_create_read_replica(cluster, rrspec, False, "", logger)