Use new UpgradeConfig 78/73678/21
authorVishal Thapar <vthapar@redhat.com>
Tue, 3 Jul 2018 04:30:07 +0000 (10:00 +0530)
committerFaseela K <faseela.k@ericsson.com>
Wed, 25 Jul 2018 01:45:31 +0000 (01:45 +0000)
SRVUTILS-2 added a new upgrade config. For backward
compatibility set the new flag each time old one is
changed.

JIRA: GENIUS-173
DependsOn: Idd3690f23ba6c048689f0d93f767eb62aad40b9e
Change-Id: I91466c31c0526ff227700f23b48b9db0dfb15f5a
Signed-off-by: Vishal Thapar <vthapar@redhat.com>
mdsalutil/mdsalutil-impl/pom.xml
mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/UpgradeStateListener.java
mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/UpgradeUtils.java [new file with mode: 0644]

index 9222bb270a2b15e499abcd297852cbcdd7c46928..8c76dfcd534dcfa712aed123605b73807387111a 100644 (file)
@@ -64,6 +64,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <!-- used (only) by DatastoreServiceStatusProvider -->
       <artifactId>sal-distributed-datastore</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.serviceutils</groupId>
+      <artifactId>upgrade</artifactId>
+      <version>0.2.0-SNAPSHOT</version>
+    </dependency>
     <dependency>
       <groupId>org.ops4j.pax.cdi</groupId>
       <artifactId>pax-cdi-api</artifactId>
index 5637ca3f3f38176995ad9b56170dfc7b5f7e5483..83680e4ea9a70a1d5c0eb52230154f172e41548d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Red Hat, Inc. and others. All rights reserved.
+ * Copyright (c) 2017, 2018 Red Hat, Inc. 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,
@@ -33,14 +33,19 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
     private static final Logger LOG = LoggerFactory.getLogger(UpgradeStateListener.class);
 
     private final AtomicBoolean isUpgradeInProgress = new AtomicBoolean(false);
+    private final UpgradeUtils upgradeUtils;
 
     @Inject
-    public UpgradeStateListener(@OsgiService final DataBroker dataBroker, final Config config) {
+    public UpgradeStateListener(@OsgiService final DataBroker dataBroker, final Config config,
+                                final UpgradeUtils upgradeStateUtils) {
         super(dataBroker, new DataTreeIdentifier<>(
                 LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Config.class)));
+        this.upgradeUtils = upgradeStateUtils;
         // When this config value is set from a file it is not accessible via the yang tree...
         // so we just write it once here just in case.
         try {
+            //TODO: DS Writes should ideally be done from one node to avoid ConflictingModExceptions
+            upgradeStateUtils.setUpgradeConfig(config.isUpgradeInProgress());
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
                     InstanceIdentifier.create(Config.class), config);
         } catch (TransactionCommitFailedException e) {
@@ -55,12 +60,14 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
 
     @Override
     public void add(@Nonnull InstanceIdentifier<Config> instanceIdentifier, @Nonnull Config config) {
+        upgradeUtils.setUpgradeConfig(config.isUpgradeInProgress());
         isUpgradeInProgress.set(config.isUpgradeInProgress());
         LOG.info("UpgradeStateListener.add: isUpgradeInProgress = {}", config.isUpgradeInProgress());
     }
 
     @Override
     public void remove(@Nonnull InstanceIdentifier<Config> instanceIdentifier, @Nonnull Config config) {
+        upgradeUtils.setUpgradeConfig(false);
         isUpgradeInProgress.set(false);
         LOG.info("UpgradeStateListener.remove: isUpgradeInProgress = {}", false);
     }
@@ -68,6 +75,7 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
     @Override
     public void update(@Nonnull InstanceIdentifier<Config> instanceIdentifier,
                        @Nonnull Config originalConfig, @Nonnull Config updatedConfig) {
+        upgradeUtils.setUpgradeConfig(updatedConfig.isUpgradeInProgress());
         isUpgradeInProgress.set(updatedConfig.isUpgradeInProgress());
         LOG.info("UpgradeStateListener.update: isUpgradeInProgress = {}", updatedConfig.isUpgradeInProgress());
     }
diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/UpgradeUtils.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/UpgradeUtils.java
new file mode 100644 (file)
index 0000000..6c1e1d8
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018 Red Hat Inc. 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.genius.mdsalutil.internal;
+
+import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+
+import java.util.concurrent.ExecutionException;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.infra.RetryingManagedNewTransactionRunner;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.upgrade.rev180702.UpgradeConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.upgrade.rev180702.UpgradeConfigBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.ops4j.pax.cdi.api.OsgiService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Singleton
+public class UpgradeUtils {
+    private static final Logger LOG = LoggerFactory.getLogger(UpgradeUtils.class);
+
+    private final DataBroker dataBroker;
+    private final RetryingManagedNewTransactionRunner txRunner;
+
+    @Inject
+    public UpgradeUtils(@OsgiService final DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
+        this.txRunner = new RetryingManagedNewTransactionRunner(dataBroker);
+    }
+
+    public void setUpgradeConfig(boolean state) {
+        UpgradeConfig upgradeConfig = new UpgradeConfigBuilder().setUpgradeInProgress(state).build();
+        try {
+            txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> tx.put(
+                InstanceIdentifier.create(UpgradeConfig.class), upgradeConfig, CREATE_MISSING_PARENTS)).get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Unable to update UpgradeState", e);
+        }
+    }
+}