package io.eguan.vold.model; /* * #%L * Project eguan * %% * Copyright (C) 2012 - 2017 Oodrive * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import io.eguan.dtx.DtxManager; import io.eguan.dtx.DtxResourceManager; import io.eguan.dtx.DtxResourceManagerContext; import io.eguan.dtx.DtxTaskInfo; import io.eguan.proto.vvr.VvrRemote.RemoteOperation; import io.eguan.vold.model.VvrManager; import io.eguan.vvr.remote.VvrDtxRmContext; import io.eguan.vvr.remote.VvrRemoteUtils; import java.io.IOException; import java.net.InetAddress; import java.util.UUID; import javax.management.ObjectName; import javax.transaction.xa.XAException; import org.junit.Assert; import com.google.protobuf.InvalidProtocolBufferException; public class VvrManagerHelper { private final static String ISCSI_ADDRESS = InetAddress.getLoopbackAddress().getHostAddress(); private final static Integer ISCSI_PORT = Integer.valueOf(3260); private final static String NBD_ADDRESS = InetAddress.getLoopbackAddress().getHostAddress(); private final static Integer NBD_PORT = Integer.valueOf(10809); private VoldTestHelper voldTestHelper; private VvrManager vvrManager; private DtxManager dtxManager; private ObjectName dtxManagerObjectName; private ObjectName dtxLocalNodeObjectName; public final static void initDtxManagement(final VvrManager vvrManager, final DtxManager dtxManager) throws IOException { vvrManager.init(dtxManager); final UUID owner = UUID.fromString(vvrManager.getOwnerUuid()); dtxManager.registerResourceManager(new DtxResourceManager() { @Override public final UUID getId() { return owner; } @Override public final DtxResourceManagerContext start(final byte[] payload) throws XAException, NullPointerException { try { return VvrRemoteUtils.createDtxContext(owner, payload); } catch (final InvalidProtocolBufferException e) { throw new XAException(XAException.XAER_INVAL); } } @Override public final Boolean prepare(final DtxResourceManagerContext context) throws XAException { final VvrDtxRmContext vvrDtxRmContext = (VvrDtxRmContext) context; return vvrManager.prepare(vvrDtxRmContext); } @Override public final void commit(final DtxResourceManagerContext context) throws XAException { final VvrDtxRmContext vvrDtxRmContext = (VvrDtxRmContext) context; vvrManager.commit(vvrDtxRmContext); } @Override public final void rollback(final DtxResourceManagerContext context) throws XAException { final VvrDtxRmContext vvrDtxRmContext = (VvrDtxRmContext) context; vvrManager.rollback(vvrDtxRmContext); } @Override public final void processPostSync() { vvrManager.processPostSync(); } @Override public final DtxTaskInfo createTaskInfo(final byte[] payload) { final RemoteOperation operation; try { operation = RemoteOperation.parseFrom(payload); } catch (final InvalidProtocolBufferException e) { return null; } return vvrManager.createTaskInfo(operation); } }); } public void init(final boolean vvrStarted, final DummyMBeanServer dummyMBeanServer, final int number) throws Exception { this.voldTestHelper = new VoldTestHelper(Boolean.valueOf(vvrStarted)); voldTestHelper.createTemporary(null, null, null, null, ISCSI_ADDRESS, Integer.valueOf(ISCSI_PORT.intValue() + 2 * number), NBD_ADDRESS, Integer.valueOf(NBD_PORT.intValue() + 2 * number)); this.vvrManager = VvrManagerTestUtils.createVvrManager(voldTestHelper, dummyMBeanServer); this.dtxManager = VvrManagerTestUtils.createDtxManagerStandAlone(dummyMBeanServer, voldTestHelper); this.dtxManagerObjectName = VvrManagerTestUtils.registerDtxManagerMXBean(dummyMBeanServer, voldTestHelper, dtxManager); this.dtxLocalNodeObjectName = VvrManagerTestUtils.registerDtxLocalNodeMXBean(dummyMBeanServer, voldTestHelper, dtxManager.new DtxLocalNode()); Assert.assertNotNull(dtxManager); initDtxManagement(vvrManager, dtxManager); Assert.assertTrue(VvrManagerTestUtils.waitMXBeanNumber(dummyMBeanServer, VoldTestHelper.MXBEANS_NUMBER_INIT)); } public void fini(final DummyMBeanServer dummyMBeanServer) throws Exception { vvrManager.fini(); if (dtxManagerObjectName != null) { dummyMBeanServer.unregisterMBean(dtxManagerObjectName); dtxManagerObjectName = null; } if (dtxLocalNodeObjectName != null) { dummyMBeanServer.unregisterMBean(dtxLocalNodeObjectName); dtxLocalNodeObjectName = null; } if (dtxManager != null) { dtxManager.stop(); dtxManager.fini(); dtxManager = null; } // All MX Beans must be unregistered Assert.assertEquals(0, dummyMBeanServer.getNbMXBeans()); voldTestHelper.destroy(); vvrManager = null; } public final VoldTestHelper getVoldTestHelper() { return voldTestHelper; } public final VvrManager getVvrManager() { return vvrManager; } public final DtxManager getDtxManager() { return dtxManager; } public final ObjectName getDtxManagerObjectName() { return dtxManagerObjectName; } public final ObjectName getDtxLocalNodeObjectName() { return dtxLocalNodeObjectName; } public final void setVoldTestHelper(final VoldTestHelper voldTestHelper) { this.voldTestHelper = voldTestHelper; } public final void setVvrManager(final VvrManager vvrManager) { this.vvrManager = vvrManager; } public final void setDtxManager(final DtxManager dtxManager) { this.dtxManager = dtxManager; } public final void setDtxManagerObjectName(final ObjectName dtxManagerObjectName) { this.dtxManagerObjectName = dtxManagerObjectName; } public final void setDtxLocalNodeObjectName(final ObjectName dtxLocalNodeObjectName) { this.dtxLocalNodeObjectName = dtxLocalNodeObjectName; } }