/*
- * 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,
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) {
@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);
}
@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());
}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+}