Skip to content

Commit 771ee46

Browse files
committed
Develop tests to NoFMemberPicker and make Member picker configurable
1 parent 2264a8d commit 771ee46

File tree

9 files changed

+119
-15
lines changed

9 files changed

+119
-15
lines changed

manager.conf.example

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ image_storage_appliance_tmp_storage=/tmp/
5151
image_storage_static_fogbow-linux-x86=55d938ef-57d1-44ea-8155-6036d170780a
5252
image_storage_static_fogbow-ubuntu-1204=81765250-a4e4-440d-a215-43c9c0849120
5353

54+
member_picker_class=org.fogbowcloud.manager.core.RoundRobinMemberPicker
55+
#If you are using NoFMemberPicker class
56+
nof_trustworthy=false
57+
58+
5459
compute_class=org.fogbowcloud.manager.core.plugins.openstack.OpenStackNovaV2ComputePlugin
5560
compute_novav2_url=http://localhost:8774
5661
compute_glancev2_url=http://localhost:9292

src/main/java/org/fogbowcloud/manager/Main.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import org.apache.log4j.Logger;
88
import org.fogbowcloud.manager.core.ConfigurationConstants;
99
import org.fogbowcloud.manager.core.DefaultMemberValidator;
10+
import org.fogbowcloud.manager.core.FederationMemberPicker;
1011
import org.fogbowcloud.manager.core.FederationMemberValidator;
1112
import org.fogbowcloud.manager.core.ManagerController;
13+
import org.fogbowcloud.manager.core.RoundRobinMemberPicker;
1214
import org.fogbowcloud.manager.core.plugins.AccountingPlugin;
1315
import org.fogbowcloud.manager.core.plugins.AuthorizationPlugin;
1416
import org.fogbowcloud.manager.core.plugins.BenchmarkingPlugin;
@@ -115,6 +117,16 @@ public static void main(String[] args) throws Exception {
115117
accountingPlugin = new FCUAccountingPlugin(properties, benchmarkingPlugin);
116118
LOGGER.warn("Accounting plugin not specified in properties. Using the default one.", e);
117119
}
120+
121+
FederationMemberPicker memberPickerPlugin = null;
122+
try {
123+
memberPickerPlugin = (FederationMemberPicker) createInstanceWithAccoutingPlugin(
124+
ConfigurationConstants.MEMBER_PICKER_PLUGIN_CLASS_KEY, properties,
125+
accountingPlugin);
126+
} catch (Exception e) {
127+
memberPickerPlugin = new RoundRobinMemberPicker(properties, accountingPlugin);
128+
LOGGER.warn("Member picker plugin not specified in properties. Using the default one.", e);
129+
}
118130

119131
ManagerController facade = new ManagerController(properties);
120132
facade.setComputePlugin(computePlugin);
@@ -125,6 +137,7 @@ public static void main(String[] args) throws Exception {
125137
facade.setValidator(validator);
126138
facade.setBenchmarkingPlugin(benchmarkingPlugin);
127139
facade.setAccountingPlugin(accountingPlugin);
140+
facade.setMemberPickerPlugin(memberPickerPlugin);
128141

129142
ManagerXmppComponent xmpp = new ManagerXmppComponent(
130143
properties.getProperty(ConfigurationConstants.XMPP_JID_KEY),
@@ -191,6 +204,13 @@ private static Object createInstanceWithBenchmarkingPlugin(
191204
return Class.forName(properties.getProperty(propName)).getConstructor(Properties.class, BenchmarkingPlugin.class)
192205
.newInstance(properties, benchmarkingPlugin);
193206
}
207+
208+
private static Object createInstanceWithAccoutingPlugin(
209+
String propName, Properties properties,
210+
AccountingPlugin accoutingPlugin) throws Exception {
211+
return Class.forName(properties.getProperty(propName)).getConstructor(Properties.class, AccountingPlugin.class)
212+
.newInstance(properties, accoutingPlugin);
213+
}
194214

195215
private static void configureLog4j() {
196216
ConsoleAppender console = new ConsoleAppender();

src/main/java/org/fogbowcloud/manager/core/ConfigurationConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,7 @@ public class ConfigurationConstants {
6565

6666
//Green
6767
public static final String GREEN_SITTER_JID = "greensitter_jid";
68+
69+
//member picker
70+
public static final String MEMBER_PICKER_PLUGIN_CLASS_KEY = "member_picker_class";
6871
}

src/main/java/org/fogbowcloud/manager/core/ManagerController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public class ManagerController {
7575
private Token federationUserToken;
7676
private final List<FederationMember> members = Collections.synchronizedList(new LinkedList<FederationMember>());
7777
private RequestRepository requests = new RequestRepository();
78-
private FederationMemberPicker memberPicker = new RoundRobinMemberPicker();
78+
private FederationMemberPicker memberPicker;
7979

8080
private BenchmarkingPlugin benchmarkingPlugin;
8181
private AccountingPlugin accountingPlugin;
@@ -116,6 +116,10 @@ public ManagerController(Properties properties, ScheduledExecutorService executo
116116
this.accountingUpdaterTimer = new ManagerTimer(executor);
117117
}
118118
}
119+
120+
public void setMemberPickerPlugin(FederationMemberPicker memberPicker) {
121+
this.memberPicker = memberPicker;
122+
}
119123

120124
public void setBenchmarkingPlugin(BenchmarkingPlugin benchmarkingPlugin) {
121125
this.benchmarkingPlugin = benchmarkingPlugin;

src/main/java/org/fogbowcloud/manager/core/NoFMemberPicker.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Map;
88
import java.util.Properties;
99

10+
import org.apache.log4j.Logger;
1011
import org.fogbowcloud.manager.core.model.FederationMember;
1112
import org.fogbowcloud.manager.core.plugins.AccountingPlugin;
1213
import org.fogbowcloud.manager.core.plugins.accounting.ResourceUsage;
@@ -15,10 +16,18 @@ public class NoFMemberPicker implements FederationMemberPicker {
1516

1617
private AccountingPlugin accoutingPlugin;
1718
private String localMemberId;
19+
private boolean trustworthy = false;
1820

21+
private static final Logger LOGGER = Logger.getLogger(NoFMemberPicker.class);
22+
1923
public NoFMemberPicker(Properties properties, AccountingPlugin accoutingPlugin) {
2024
this.accoutingPlugin = accoutingPlugin;
2125
this.localMemberId = properties.getProperty(ConfigurationConstants.XMPP_JID_KEY);
26+
try {
27+
this.trustworthy = Boolean.valueOf(properties.getProperty("nof_trustworthy"));
28+
} catch (Exception e) {
29+
LOGGER.error("Error while getting boolean valued from ", e);
30+
}
2231
}
2332

2433
@Override
@@ -33,38 +42,41 @@ public FederationMember pick(ManagerController facade) {
3342
continue;
3443
}
3544

36-
double reputation = 0d;
45+
double debt = 0d;
3746
if (membersUsage.containsKey(memberId)) {
38-
reputation = membersUsage.get(memberId).getConsumed()
39-
- membersUsage.get(memberId).getDonated()
40-
+ Math.sqrt(membersUsage.get(memberId).getDonated());
47+
debt = membersUsage.get(memberId).getConsumed()
48+
- membersUsage.get(memberId).getDonated();
49+
if (!trustworthy) {
50+
debt = Math.max(0,
51+
debt + Math.sqrt(membersUsage.get(memberId).getDonated()));
52+
}
4153
}
42-
reputableMembers.add(new ReputableFederationMember(currentMember, reputation));
54+
reputableMembers.add(new ReputableFederationMember(currentMember, debt));
4355
}
4456

4557
if (reputableMembers.isEmpty()) {
4658
return null;
4759
}
4860
Collections.sort(reputableMembers, new ReputableFederationMemberComparator());
49-
return reputableMembers.getLast().getMember();
61+
return reputableMembers.getFirst().getMember();
5062
}
5163

5264
class ReputableFederationMember {
5365

5466
private FederationMember member;
55-
private double reputation;
67+
private double debt;
5668

57-
public ReputableFederationMember(FederationMember member, double reputation) {
69+
public ReputableFederationMember(FederationMember member, double debt) {
5870
this.member = member;
59-
this.reputation = reputation;
71+
this.debt = debt;
6072
}
6173

6274
public FederationMember getMember() {
6375
return member;
6476
}
6577

66-
public double getReputation() {
67-
return reputation;
78+
public double getDebt() {
79+
return debt;
6880
}
6981
}
7082

@@ -73,9 +85,13 @@ class ReputableFederationMemberComparator implements Comparator<ReputableFederat
7385
public int compare(ReputableFederationMember firstReputableMember,
7486
ReputableFederationMember secondReputableMember) {
7587

76-
return new Double(firstReputableMember.getReputation()).compareTo(new Double(
77-
secondReputableMember.getReputation()));
88+
return new Double(firstReputableMember.getDebt()).compareTo(new Double(
89+
secondReputableMember.getDebt()));
7890
}
7991
}
92+
93+
public boolean getTrustworthy() {
94+
return trustworthy;
95+
}
8096
}
8197

src/main/java/org/fogbowcloud/manager/core/RoundRobinMemberPicker.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package org.fogbowcloud.manager.core;
22

33
import java.util.List;
4+
import java.util.Properties;
45

56
import org.fogbowcloud.manager.core.model.FederationMember;
7+
import org.fogbowcloud.manager.core.plugins.AccountingPlugin;
68

79
public class RoundRobinMemberPicker implements FederationMemberPicker {
810

911
private int current = -1;
1012

13+
public RoundRobinMemberPicker(Properties properties, AccountingPlugin accountingPlugin) {
14+
}
15+
1116
@Override
1217
public FederationMember pick(ManagerController facade) {
1318
List<FederationMember> members = facade.getMembers();

src/test/java/org/fogbowcloud/manager/core/TestManagerController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,12 @@ private void checkRequestPerUserToken(Token token) {
162162
public void testSubmitToGreenSitter() {
163163
AsyncPacketSender packetSender = Mockito.mock(AsyncPacketSender.class);
164164
managerController.setPacketSender(packetSender);
165-
165+
166+
FederationMemberPicker memberPickerPlugin = Mockito.mock(FederationMemberPicker.class);
167+
Mockito.when(memberPickerPlugin.pick(Mockito.any(ManagerController.class)))
168+
.thenReturn(null);
169+
managerController.setMemberPickerPlugin(memberPickerPlugin);
170+
166171
ComputePlugin computePlugin = Mockito.mock(ComputePlugin.class);
167172

168173
ResourcesInfo localResourcesInfo = new ResourcesInfo("", "", "", "", null);
@@ -1729,6 +1734,7 @@ public void testInstanceIsBeingUsedByDeletedRequest(){
17291734
+ Request.SEPARATOR_GLOBAL_ID + "remote-manager.test.com"));
17301735
}
17311736

1737+
@SuppressWarnings("unchecked")
17321738
@Test
17331739
public void testInstanceIsNotBeingUsedButRequestWasForwarded(){
17341740
AsyncPacketSender packetSender = Mockito.mock(AsyncPacketSender.class);

src/test/java/org/fogbowcloud/manager/core/TestNoFMemberPicker.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public void setUp(){
2525
properties = new Properties();
2626
properties.put(ConfigurationConstants.XMPP_JID_KEY,
2727
DefaultDataTestHelper.LOCAL_MANAGER_COMPONENT_URL);
28+
properties.put("nof_trustworthy", "false");
2829

2930
accoutingPlugin = Mockito.mock(AccountingPlugin.class);
3031

@@ -40,6 +41,7 @@ public void testEmptyMembers() {
4041

4142
NoFMemberPicker nofPicker = new NoFMemberPicker(properties, accoutingPlugin);
4243
Assert.assertNull(nofPicker.pick(facade));
44+
Assert.assertFalse(nofPicker.getTrustworthy());
4345
}
4446

4547
@Test
@@ -56,6 +58,7 @@ public void testOnlyLocalMember() {
5658

5759
NoFMemberPicker nofPicker = new NoFMemberPicker(properties, accoutingPlugin);
5860
Assert.assertNull(nofPicker.pick(facade));
61+
Assert.assertFalse(nofPicker.getTrustworthy());
5962
}
6063

6164
@Test
@@ -81,5 +84,39 @@ public void testOneRemoteMember() {
8184

8285
NoFMemberPicker nofPicker = new NoFMemberPicker(properties, accoutingPlugin);
8386
Assert.assertEquals(remoteMember, nofPicker.pick(facade));
87+
Assert.assertFalse(nofPicker.getTrustworthy());
88+
}
89+
90+
@Test
91+
public void testTwoRemoteMembers() {
92+
// mocking facade
93+
FederationMember localMember = new FederationMember(new ResourcesInfo(
94+
DefaultDataTestHelper.LOCAL_MANAGER_COMPONENT_URL, "", "", "", "", null));
95+
FederationMember remoteMember1 = new FederationMember(new ResourcesInfo(
96+
DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL + "1", "", "", "", "", null));
97+
FederationMember remoteMember2 = new FederationMember(new ResourcesInfo(
98+
DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL + "2", "", "", "", "", null));
99+
ArrayList<FederationMember> membersToReturn = new ArrayList<FederationMember>();
100+
membersToReturn.add(localMember);
101+
membersToReturn.add(remoteMember1);
102+
membersToReturn.add(remoteMember2);
103+
Mockito.when(facade.getMembers()).thenReturn(membersToReturn);
104+
105+
// mocking accounting
106+
HashMap<String, ResourceUsage> membersUsageToReturn = new HashMap<String, ResourceUsage>();
107+
ResourceUsage resUsage1 = new ResourceUsage(DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL + "1");
108+
resUsage1.addConsumption(4);
109+
resUsage1.addDonation(16);
110+
membersUsageToReturn.put(DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL + "1", resUsage1);
111+
ResourceUsage resUsage2 = new ResourceUsage(DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL + "2");
112+
resUsage2.addConsumption(10);
113+
resUsage2.addDonation(16);
114+
membersUsageToReturn.put(DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL + "2", resUsage2);
115+
Mockito.when(accoutingPlugin.getMembersUsage()).thenReturn(
116+
membersUsageToReturn);
117+
118+
NoFMemberPicker nofPicker = new NoFMemberPicker(properties, accoutingPlugin);
119+
Assert.assertEquals(remoteMember1, nofPicker.pick(facade));
120+
Assert.assertFalse(nofPicker.getTrustworthy());
84121
}
85122
}

src/test/java/org/fogbowcloud/manager/core/util/ManagerTestHelper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.dom4j.Element;
2020
import org.fogbowcloud.manager.core.ConfigurationConstants;
2121
import org.fogbowcloud.manager.core.DefaultMemberValidator;
22+
import org.fogbowcloud.manager.core.FederationMemberPicker;
2223
import org.fogbowcloud.manager.core.ManagerController;
2324
import org.fogbowcloud.manager.core.model.FederationMember;
2425
import org.fogbowcloud.manager.core.model.Flavor;
@@ -60,6 +61,7 @@ public class ManagerTestHelper extends DefaultDataTestHelper {
6061
private AuthorizationPlugin authorizationPlugin;
6162
private BenchmarkingPlugin benchmarkingPlugin;
6263
private AccountingPlugin accountingPlugin;
64+
private FederationMemberPicker memberPickerPlugin;
6365
private Token defaultUserToken;
6466
private Token defaultFederationToken;
6567
private FakeXMPPServer fakeServer = new FakeXMPPServer();
@@ -380,13 +382,19 @@ public ManagerController createDefaultManagerController() {
380382

381383
accountingPlugin = Mockito.mock(AccountingPlugin.class);
382384

385+
memberPickerPlugin = Mockito.mock(FederationMemberPicker.class);
386+
Mockito.when(memberPickerPlugin.pick(Mockito.any(ManagerController.class))).thenReturn(
387+
new FederationMember(new ResourcesInfo(
388+
DefaultDataTestHelper.REMOTE_MANAGER_COMPONENT_URL, "", "", "", null)));
389+
383390
managerController.setAuthorizationPlugin(authorizationPlugin);
384391
managerController.setLocalIdentityPlugin(identityPlugin);
385392
managerController.setFederationIdentityPlugin(federationIdentityPlugin);
386393
managerController.setComputePlugin(computePlugin);
387394
managerController.setBenchmarkingPlugin(benchmarkingPlugin);
388395
managerController.setAccountingPlugin(accountingPlugin);
389396
managerController.setValidator(new DefaultMemberValidator(null));
397+
managerController.setMemberPickerPlugin(memberPickerPlugin);
390398
return managerController;
391399
}
392400

0 commit comments

Comments
 (0)