Martin Mucha has uploaded a new change for review.

Change subject: core: move allocated macs to related pool when its created.
......................................................................

core: move allocated macs to related pool when its created.

If there's some data center in system without configured own mac pool
then allocated macs are registered in global pool. When this data
center configuration is changed and new pool is created for it, macs
related to it have to leave global mac pool and move to newly created
one.

Change-Id: Ia935ce8e8f63b6849a4bd63768b2d45fec61c1c8
Bug-Url: https://bugzilla.redhat.com/1078844
Signed-off-by: Martin Mucha <mmu...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/DataCenterScope.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerOriginal.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerRanges.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerStrategy.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/macPoolManager/ScopedMacPoolManagerTest.java
5 files changed, 134 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/73/26973/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/DataCenterScope.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/DataCenterScope.java
index 09cf956..6b9736d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/DataCenterScope.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/DataCenterScope.java
@@ -73,7 +73,7 @@
         final List<StoragePool> storagePools = 
DbFacade.getInstance().getStoragePoolDao().getAll();
         for (StoragePool storagePool : storagePools) {
             final Guid storagePoolId = storagePool.getId();
-            List<String> macsForDataCenter = 
DbFacade.getInstance().getVmNicDao().getAllMacsByDataCenter(storagePoolId);
+            List<String> macsForDataCenter = 
allMacsForDataCenter(storagePoolId);
 
             final String macPoolRanges = storagePool.getMacPoolRanges();
             if (macPoolRanges != null) {
@@ -82,6 +82,10 @@
 
             fillPool(getPoolInternal(storagePoolId), macsForDataCenter);
         }
+    }
+
+    private List<String> allMacsForDataCenter(Guid storagePoolId) {
+        return 
DbFacade.getInstance().getVmNicDao().getAllMacsByDataCenter(storagePoolId);
     }
 
     private void fillPool(MacPoolManagerStrategy pool, List<String> 
macsForDataCenter) {
@@ -140,21 +144,48 @@
     protected boolean modifyPoolInternal(Guid scopeGuid, String ranges) {
         final boolean scopeExist = scopedPools.containsKey(scopeGuid);
         if (!scopeExist) {
-            return createPool(scopeGuid, ranges);
+            return createsNewPoolUponModifyPoolRequest(scopeGuid, ranges);
         }
 
         final boolean poolDefinitionRemoved = rangesDefinitionIsEmpty(ranges);
         if (poolDefinitionRemoved) {
-            return removePool(scopeGuid);
+            final boolean removed = removePoolInternal(scopeGuid);
+            return removed;
         }
 
+        return modifyExistingPoolSettings(scopeGuid, ranges);
+    }
+
+    private boolean modifyExistingPoolSettings(Guid scopeGuid, String ranges) {
         final MacPoolManagerStrategy currentPool = getPool(scopeGuid);
-        final MacPoolManagerStrategy newPool = createAndInitPool(ranges);
 
-        currentPool.copyContent(newPool);
-        scopedPools.put(scopeGuid, newPool);    //replace currentPool
+        if (currentPool.getMacPoolRanges().equals(ranges)) {
+//            ranges definition did not change, do nothing.
+            return false;
+        } else {
+            final MacPoolManagerStrategy newPool = createAndInitPool(ranges);
 
-        return true;
+            currentPool.copyContent(newPool);
+            scopedPools.put(scopeGuid, newPool);    //replace currentPool
+
+            return true;
+        }
+    }
+
+    private boolean createsNewPoolUponModifyPoolRequest(Guid scopeGuid, String 
ranges) {
+        final boolean modified = createPoolInternal(scopeGuid, ranges);
+
+        final MacPoolManagerStrategy alteredPool = getPool(scopeGuid);
+        for (String mac : allMacsForDataCenter(scopeGuid)) {
+            if (defaultPool.isMacInUse(mac)) {
+                defaultPool.freeMac(mac);
+            } else {
+                log.warn("Mac address, which should be allocated in global 
pool is not used there.");
+            }
+
+            alteredPool.addMac(mac);
+        }
+        return modified;
     }
 
     /**
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerOriginal.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerOriginal.java
index 5b2b93b..5839aa7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerOriginal.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerOriginal.java
@@ -65,6 +65,11 @@
     }
 
     @Override
+    public String getMacPoolRanges() {
+        return ranges;
+    }
+
+    @Override
     public void initialize() {
         lockObj.writeLock().lock();
         try {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerRanges.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerRanges.java
index e17c66f..22b9518 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerRanges.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerRanges.java
@@ -35,6 +35,11 @@
     }
 
     @Override
+    public String getMacPoolRanges() {
+        return rangesString;
+    }
+
+    @Override
     public void initialize() {
         if (initialized) {
             //this should rather throw an exception, but that is rather 
complicated to handle in jUnit.
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerStrategy.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerStrategy.java
index 77801f0..90fc6dc 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerStrategy.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/macPoolManager/MacPoolManagerStrategy.java
@@ -24,5 +24,8 @@
 
     void copyContent(MacPoolManagerStrategy macPoolManagerStrategy);
 
-
+    /**
+     * @return ranges definition for this pool.
+     */
+    String getMacPoolRanges();
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/macPoolManager/ScopedMacPoolManagerTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/macPoolManager/ScopedMacPoolManagerTest.java
index aa147f2..fd63465 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/macPoolManager/ScopedMacPoolManagerTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/macPoolManager/ScopedMacPoolManagerTest.java
@@ -230,9 +230,89 @@
         errorCollector.checkThat("provided mac should not be used in returned 
pool", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool().isMacInUse(macAddress2),
 is(false));
         errorCollector.checkThat("provided mac should be used in returned 
pool", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic2).getPool().isMacInUse(macAddress2),
 is(true));
 
-        errorCollector.checkThat("provided mac should be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress1), is(false));
-        errorCollector.checkThat("provided mac should be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress2), is(false));
+        errorCollector.checkThat("provided mac should not be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress1), is(false));
+        errorCollector.checkThat("provided mac should not be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress2), is(false));
+    }
 
+    @Test
+    //test whether allocated mac get moved to global pool when it's scoped 
pool is removed.
+    public void testAllocatedMacMigrationOnDataCenterScopeRemoval() throws 
Exception {
+        //mock data center
+        final StoragePool storagePool1 = new StoragePool();
+        storagePool1.setMacPoolRanges("00:1a:4a:15:c0:00-00:1a:4a:15:c0:09");
+        storagePool1.setId(Guid.newGuid());
 
+        //mock first vm to be in first data center
+        final VM vm1 = new VM();
+        vm1.setId(Guid.newGuid());
+        vm1.setStoragePoolId(storagePool1.getId());
+
+        //mock first vmNic
+        final String macAddress1 = "00:1a:4a:15:c0:fe";
+        final VmNic vmNic1 = new VmNic();
+        vmNic1.setMacAddress(macAddress1);
+        vmNic1.setVmId(vm1.getId());
+
+        when(vmDaoMock.get(eq(vm1.getId()))).thenReturn(vm1);
+
+        when(storagePoolDaoMock.getAll()).thenReturn(Arrays.asList(new 
StoragePool[] { storagePool1 }));
+        when(vmNicDaoMock.getAll()).thenReturn(Arrays.asList(new VmNic[] { 
vmNic1 }));
+
+        //mock querying for existing mac addresses for given data center.
+        
when(vmNicDaoMock.getAllMacsByDataCenter(eq(storagePool1.getId()))).thenReturn(Collections.singletonList(macAddress1));
+
+        ScopedMacPoolManager.initialize();
+
+        //assertions: macAddress1 is referenced from scoped pool, not from 
global one.
+        errorCollector.checkThat("scoped pool for this nic should exist", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).isScopeExist(), is(true));
+        errorCollector.checkThat("default scope should not be returned for 
this vmNic", ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool(), 
CoreMatchers.not(equalTo(ScopedMacPoolManager.defaultScope())));
+        errorCollector.checkThat("provided mac should be used in returned 
pool", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool().isMacInUse(macAddress1),
 is(true));
+        errorCollector.checkThat("provided mac should not be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress1), is(false));
+
+        ScopedMacPoolManager.scopeFor().vmNic(vmNic1).removePool();
+        errorCollector.checkThat("scoped pool for this nic should not exist", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).isScopeExist(), is(false));
+        errorCollector.checkThat("default scope should be returned for this 
vmNic", ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool(), 
equalTo(ScopedMacPoolManager.defaultScope()));
+        errorCollector.checkThat("provided mac should not be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress1), is(true));
+    }
+
+    @Test
+    //test whether allocated mac get moved to global pool when it's scoped 
pool is removed.
+    public void testAllocatedMacMigrationOnDataCenterScopeCreation() throws 
Exception {
+        //mock data center
+        final StoragePool storagePool1 = new StoragePool();
+//        storagePool1.setMacPoolRanges("00:1a:4a:15:c0:00-00:1a:4a:15:c0:09");
+        storagePool1.setId(Guid.newGuid());
+
+        //mock first vm to be in first data center
+        final VM vm1 = new VM();
+        vm1.setId(Guid.newGuid());
+        vm1.setStoragePoolId(storagePool1.getId());
+
+        //mock first vmNic
+        final String macAddress1 = "00:1a:4a:15:c0:fe";
+        final VmNic vmNic1 = new VmNic();
+        vmNic1.setMacAddress(macAddress1);
+        vmNic1.setVmId(vm1.getId());
+
+        when(vmDaoMock.get(eq(vm1.getId()))).thenReturn(vm1);
+
+        when(storagePoolDaoMock.getAll()).thenReturn(Arrays.asList(new 
StoragePool[] { storagePool1 }));
+        when(vmNicDaoMock.getAll()).thenReturn(Arrays.asList(new VmNic[] { 
vmNic1 }));
+
+        //mock querying for existing mac addresses for given data center.
+        
when(vmNicDaoMock.getAllMacsByDataCenter(eq(storagePool1.getId()))).thenReturn(Collections.singletonList(macAddress1));
+
+        ScopedMacPoolManager.initialize();
+
+        //assertions: macAddress1 is referenced from scoped pool, not from 
global one.
+        errorCollector.checkThat("scoped pool for this nic should exist", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).isScopeExist(), is(false));
+        errorCollector.checkThat("default scope should not be returned for 
this vmNic", ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool(), 
equalTo(ScopedMacPoolManager.defaultScope()));
+        errorCollector.checkThat("provided mac should not be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress1), is(true));
+
+        
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).modifyPool("00:1a:4a:15:c0:00-00:1a:4a:15:c0:09");
+        errorCollector.checkThat("scoped pool for this nic should not exist", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).isScopeExist(), is(true));
+        errorCollector.checkThat("default scope should be returned for this 
vmNic", ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool(), 
CoreMatchers.not(equalTo(ScopedMacPoolManager.defaultScope())));
+        errorCollector.checkThat("provided mac should be used in returned 
pool", 
ScopedMacPoolManager.scopeFor().vmNic(vmNic1).getPool().isMacInUse(macAddress1),
 is(true));
+        errorCollector.checkThat("provided mac should not be used in returned 
pool", ScopedMacPoolManager.defaultScope().isMacInUse(macAddress1), is(false));
     }
 }


-- 
To view, visit http://gerrit.ovirt.org/26973
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia935ce8e8f63b6849a4bd63768b2d45fec61c1c8
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Martin Mucha <mmu...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to