X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Feos-dom-akka%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Feos%2Fakka%2Fowner%2Fsupervisor%2FIdleSupervisor.java;fp=opendaylight%2Fmd-sal%2Feos-dom-akka%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Feos%2Fakka%2Fowner%2Fsupervisor%2FIdleSupervisor.java;h=9cbea5c83663c039dde689fddbb7781b1959fa1d;hp=0000000000000000000000000000000000000000;hb=95a52fc4c0a1c9a9abe787b3f0e7ffa340709a96;hpb=47de86692709658b4495d2566c91e7a61d62de91 diff --git a/opendaylight/md-sal/eos-dom-akka/src/main/java/org/opendaylight/controller/eos/akka/owner/supervisor/IdleSupervisor.java b/opendaylight/md-sal/eos-dom-akka/src/main/java/org/opendaylight/controller/eos/akka/owner/supervisor/IdleSupervisor.java new file mode 100644 index 0000000000..9cbea5c836 --- /dev/null +++ b/opendaylight/md-sal/eos-dom-akka/src/main/java/org/opendaylight/controller/eos/akka/owner/supervisor/IdleSupervisor.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.eos.akka.owner.supervisor; + +import akka.actor.typed.Behavior; +import akka.actor.typed.javadsl.AbstractBehavior; +import akka.actor.typed.javadsl.ActorContext; +import akka.actor.typed.javadsl.Behaviors; +import akka.actor.typed.javadsl.Receive; +import akka.cluster.Member; +import akka.cluster.typed.Cluster; +import org.opendaylight.controller.eos.akka.owner.supervisor.command.ActivateDataCenter; +import org.opendaylight.controller.eos.akka.owner.supervisor.command.OwnerSupervisorCommand; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Initial Supervisor behavior that stays idle and only switches itself to the active behavior when its running + * in the primary datacenter, or is activated on demand. Once the supervisor instance is no longer needed in the + * secondary datacenter it needs to be deactivated manually. + */ +public final class IdleSupervisor extends AbstractBehavior { + private static final Logger LOG = LoggerFactory.getLogger(IdleSupervisor.class); + + private static final String DATACENTER_PREFIX = "dc-"; + private static final String DEFAULT_DATACENTER = "dc-default"; + + private IdleSupervisor(final ActorContext context) { + super(context); + final Cluster cluster = Cluster.get(context.getSystem()); + + final String datacenterRole = extractDatacenterRole(cluster.selfMember()); + if (datacenterRole.equals(DEFAULT_DATACENTER)) { + LOG.debug("No datacenter configured, activating default data center"); + context.getSelf().tell(ActivateDataCenter.INSTANCE); + } + + LOG.debug("Idle supervisor started on {}.", cluster.selfMember()); + } + + public static Behavior create() { + + return Behaviors.setup(IdleSupervisor::new); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(ActivateDataCenter.class, this::onActivateDataCenter) + .build(); + } + + private Behavior onActivateDataCenter(final ActivateDataCenter message) { + LOG.debug("Received ActivateDataCenter command switching to syncer behavior,"); + return OwnerSyncer.create(); + } + + private String extractDatacenterRole(final Member selfMember) { + return selfMember.getRoles().stream() + .filter(role -> role.startsWith(DATACENTER_PREFIX)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(selfMember + " does not have a valid role")); + } +}