Use akka-multi-dc in eos native
[controller.git] / opendaylight / md-sal / eos-dom-akka / src / main / java / org / opendaylight / controller / eos / akka / owner / supervisor / IdleSupervisor.java
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 (file)
index 0000000..9cbea5c
--- /dev/null
@@ -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<OwnerSupervisorCommand> {
+    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<OwnerSupervisorCommand> 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<OwnerSupervisorCommand> create() {
+
+        return Behaviors.setup(IdleSupervisor::new);
+    }
+
+    @Override
+    public Receive<OwnerSupervisorCommand> createReceive() {
+        return newReceiveBuilder()
+                .onMessage(ActivateDataCenter.class, this::onActivateDataCenter)
+                .build();
+    }
+
+    private Behavior<OwnerSupervisorCommand> 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"));
+    }
+}