def on_innodbcluster_read_replicas_changed()

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)