diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateRequest.java index 9ae4a12..fb3b693 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateRequest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateRequest.java @@ -26,6 +26,7 @@ import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ResourceBlacklistRequest; +import org.apache.hadoop.yarn.api.records.ResourceChangeContext; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.util.Records; @@ -60,12 +61,24 @@ public static AllocateRequest newInstance(int responseID, float appProgress, List resourceAsk, List containersToBeReleased, ResourceBlacklistRequest resourceBlacklistRequest) { + return newInstance(responseID, appProgress, resourceAsk, containersToBeReleased, + resourceBlacklistRequest, null); + } + + @Public + @Stable + public static AllocateRequest newInstance(int responseID, float appProgress, + List resourceAsk, + List containersToBeReleased, + ResourceBlacklistRequest resourceBlacklistRequest, + List increaseRequests) { AllocateRequest allocateRequest = Records.newRecord(AllocateRequest.class); allocateRequest.setResponseId(responseID); allocateRequest.setProgress(appProgress); allocateRequest.setAskList(resourceAsk); allocateRequest.setReleaseList(containersToBeReleased); allocateRequest.setResourceBlacklistRequest(resourceBlacklistRequest); + allocateRequest.setIncreaseRequests(increaseRequests); return allocateRequest; } @@ -170,4 +183,11 @@ public static AllocateRequest newInstance(int responseID, float appProgress, @Stable public abstract void setResourceBlacklistRequest( ResourceBlacklistRequest resourceBlacklistRequest); + + @Public + public abstract List getIncreaseRequests(); + + @Public + public abstract void setIncreaseRequests( + List increaseRequests); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateResponse.java index 3de74f7..74c8d56 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateResponse.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/AllocateResponse.java @@ -33,6 +33,8 @@ import org.apache.hadoop.yarn.api.records.NodeReport; import org.apache.hadoop.yarn.api.records.PreemptionMessage; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceChangeContext; +import org.apache.hadoop.yarn.api.records.ResourceIncreaseContext; import org.apache.hadoop.yarn.util.Records; /** @@ -82,6 +84,22 @@ public static AllocateResponse newInstance(int responseId, response.setNMTokens(nmTokens); return response; } + + @Public + public static AllocateResponse newInstance(int responseId, + List completedContainers, + List allocatedContainers, List updatedNodes, + Resource availResources, AMCommand command, int numClusterNodes, + PreemptionMessage preempt, List nmTokens, + List increasedContainers, + List decreasedContainers) { + AllocateResponse response = newInstance(responseId, completedContainers, + allocatedContainers, updatedNodes, availResources, command, + numClusterNodes, preempt, nmTokens); + response.setIncreasedContainers(increasedContainers); + response.setDecreasedContainers(decreasedContainers); + return response; + } /** * If the ResourceManager needs the @@ -221,4 +239,18 @@ public static AllocateResponse newInstance(int responseId, @Private @Unstable public abstract void setNMTokens(List nmTokens); + + @Public + public abstract List getIncreasedContainers(); + + @Public + public abstract void setIncreasedContainers( + List increasedContainers); + + @Public + public abstract List getDecreasedContainers(); + + @Public + public abstract void setDecreasedContainers( + List decreasedContainers); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto index cfe71d4..cf7a5cd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto @@ -62,6 +62,7 @@ message AllocateRequestProto { optional ResourceBlacklistRequestProto blacklist_request = 3; optional int32 response_id = 4; optional float progress = 5; + repeated ResourceChangeContextProto increase_request = 6; } message NMTokenProto { @@ -79,6 +80,8 @@ message AllocateResponseProto { optional int32 num_cluster_nodes = 7; optional PreemptionMessageProto preempt = 8; repeated NMTokenProto nm_tokens = 9; + repeated ResourceIncreaseContextProto increased_containers = 10; + repeated ResourceChangeContextProto decreased_containers = 11; } ////////////////////////////////////////////////////// diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateRequestPBImpl.java index bff252f..ebf3b65 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateRequestPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateRequestPBImpl.java @@ -28,12 +28,15 @@ import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ResourceBlacklistRequest; +import org.apache.hadoop.yarn.api.records.ResourceChangeContext; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ResourceBlacklistRequestPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.ResourceChangeContextPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ResourceRequestPBImpl; import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; import org.apache.hadoop.yarn.proto.YarnProtos.ResourceBlacklistRequestProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ResourceChangeContextProto; import org.apache.hadoop.yarn.proto.YarnProtos.ResourceRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.AllocateRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.AllocateRequestProtoOrBuilder; @@ -49,9 +52,9 @@ private List ask = null; private List release = null; + private List increaseRequests = null; private ResourceBlacklistRequest blacklistRequest = null; - public AllocateRequestPBImpl() { builder = AllocateRequestProto.newBuilder(); } @@ -62,7 +65,7 @@ public AllocateRequestPBImpl(AllocateRequestProto proto) { } public AllocateRequestProto getProto() { - mergeLocalToProto(); + mergeLocalToProto(); proto = viaProto ? proto : builder.build(); viaProto = true; return proto; @@ -95,6 +98,9 @@ private void mergeLocalToBuilder() { if (this.release != null) { addReleasesToProto(); } + if (this.increaseRequests != null) { + addIncreaseRequestsToProto(); + } if (this.blacklistRequest != null) { builder.setBlacklistRequest(convertToProtoFormat(this.blacklistRequest)); } @@ -156,6 +162,22 @@ public void setAskList(final List resourceRequests) { } @Override + public List getIncreaseRequests() { + initIncreaseRequests(); + return this.increaseRequests; + } + + @Override + public void setIncreaseRequests(List increaseRequests) { + if (increaseRequests == null) { + return; + } + initIncreaseRequests(); + this.increaseRequests.clear(); + this.increaseRequests.addAll(increaseRequests); + } + + @Override public ResourceBlacklistRequest getResourceBlacklistRequest() { AllocateRequestProtoOrBuilder p = viaProto ? proto : builder; if (this.blacklistRequest != null) { @@ -223,6 +245,54 @@ public void remove() { }; builder.addAllAsk(iterable); } + + private void initIncreaseRequests() { + if (this.increaseRequests != null) { + return; + } + AllocateRequestProtoOrBuilder p = viaProto ? proto : builder; + List list = p.getIncreaseRequestList(); + this.increaseRequests = new ArrayList(); + + for (ResourceChangeContextProto c : list) { + this.increaseRequests.add(convertFromProtoFormat(c)); + } + } + + private void addIncreaseRequestsToProto() { + maybeInitBuilder(); + builder.clearIncreaseRequest(); + if (increaseRequests == null) + return; + Iterable iterable = new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + + Iterator iter = increaseRequests.iterator(); + + @Override + public boolean hasNext() { + return iter.hasNext(); + } + + @Override + public ResourceChangeContextProto next() { + return convertToProtoFormat(iter.next()); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + + } + }; + + } + }; + builder.addAllIncreaseRequest(iterable); + } + @Override public List getReleaseList() { initReleases(); @@ -292,6 +362,15 @@ private ResourceRequestPBImpl convertFromProtoFormat(ResourceRequestProto p) { private ResourceRequestProto convertToProtoFormat(ResourceRequest t) { return ((ResourceRequestPBImpl)t).getProto(); } + + private ResourceChangeContextPBImpl convertFromProtoFormat(ResourceChangeContextProto p) { + return new ResourceChangeContextPBImpl(p); + } + + private ResourceChangeContextProto convertToProtoFormat(ResourceChangeContext t) { + return ((ResourceChangeContextPBImpl)t).getProto(); + } + private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { return new ContainerIdPBImpl(p); @@ -308,6 +387,4 @@ private ResourceBlacklistRequestPBImpl convertFromProtoFormat(ResourceBlacklistR private ResourceBlacklistRequestProto convertToProtoFormat(ResourceBlacklistRequest t) { return ((ResourceBlacklistRequestPBImpl)t).getProto(); } - - } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateResponsePBImpl.java index 37d5971..6f54d20 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateResponsePBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/AllocateResponsePBImpl.java @@ -33,17 +33,23 @@ import org.apache.hadoop.yarn.api.records.NodeReport; import org.apache.hadoop.yarn.api.records.PreemptionMessage; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceChangeContext; +import org.apache.hadoop.yarn.api.records.ResourceIncreaseContext; import org.apache.hadoop.yarn.api.records.impl.pb.ContainerPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ContainerStatusPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.NMTokenPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.NodeReportPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.PreemptionMessagePBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ProtoUtils; +import org.apache.hadoop.yarn.api.records.impl.pb.ResourceChangeContextPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.ResourceIncreaseContextPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ResourcePBImpl; import org.apache.hadoop.yarn.proto.YarnProtos.ContainerProto; import org.apache.hadoop.yarn.proto.YarnProtos.ContainerStatusProto; import org.apache.hadoop.yarn.proto.YarnProtos.NodeReportProto; import org.apache.hadoop.yarn.proto.YarnProtos.PreemptionMessageProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ResourceChangeContextProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ResourceIncreaseContextProto; import org.apache.hadoop.yarn.proto.YarnProtos.ResourceProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.AllocateResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.AllocateResponseProtoOrBuilder; @@ -63,6 +69,8 @@ private List allocatedContainers = null; private List nmTokens = null; private List completedContainersStatuses = null; + private List increasedContainers = null; + private List decreasedContainers = null; private List updatedNodes = null; private PreemptionMessage preempt; @@ -108,7 +116,7 @@ private synchronized void mergeLocalToBuilder() { if (this.allocatedContainers != null) { builder.clearAllocatedContainers(); Iterable iterable = - getProtoIterable(this.allocatedContainers); + getContainerProtoIterable(this.allocatedContainers); builder.addAllAllocatedContainers(iterable); } if (nmTokens != null) { @@ -134,6 +142,16 @@ private synchronized void mergeLocalToBuilder() { if (this.preempt != null) { builder.setPreempt(convertToProtoFormat(this.preempt)); } + if (this.increasedContainers != null) { + builder.clearIncreasedContainers(); + Iterable iterable = getIncreaseProtoIterable(this.increasedContainers); + builder.addAllIncreasedContainers(iterable); + } + if (this.decreasedContainers != null) { + builder.clearDecreasedContainers(); + Iterable iterable = getChangeProtoIterable(this.decreasedContainers); + builder.addAllDecreasedContainers(iterable); + } } private synchronized void mergeLocalToProto() { @@ -306,6 +324,63 @@ public synchronized void setPreemptionMessage(PreemptionMessage preempt) { this.preempt = preempt; } + @Override + public synchronized List getIncreasedContainers() { + initLocalIncreasedContainerList(); + return increasedContainers; + } + + @Override + public synchronized void setIncreasedContainers( + List increasedContainers) { + if (increasedContainers == null) + return; + initLocalIncreasedContainerList(); + this.increasedContainers.addAll(increasedContainers); + } + + @Override + public synchronized List getDecreasedContainers() { + initLocalDecreasedContainerList(); + return decreasedContainers; + } + + @Override + public synchronized void setDecreasedContainers( + List decreasedContainers) { + if (decreasedContainers == null) { + return; + } + initLocalDecreasedContainerList(); + this.decreasedContainers.addAll(decreasedContainers); + } + + private synchronized void initLocalIncreasedContainerList() { + if (this.increasedContainers != null) { + return; + } + AllocateResponseProtoOrBuilder p = viaProto ? proto : builder; + List list = p.getIncreasedContainersList(); + increasedContainers = new ArrayList(); + + for (ResourceIncreaseContextProto c : list) { + increasedContainers.add(convertFromProtoFormat(c)); + } + } + + private synchronized void initLocalDecreasedContainerList() { + if (this.decreasedContainers != null) { + return; + } + AllocateResponseProtoOrBuilder p = viaProto ? proto : builder; + List list = p.getDecreasedContainersList(); + decreasedContainers = new ArrayList(); + + for (ResourceChangeContextProto c : list) { + decreasedContainers.add(convertFromProtoFormat(c)); + } + } + // Once this is called. updatedNodes will never be null - until a getProto is // called. private synchronized void initLocalNewNodeReportList() { @@ -348,7 +423,69 @@ private synchronized void initLocalNewNMTokenList() { } } - private synchronized Iterable getProtoIterable( + private synchronized Iterable getIncreaseProtoIterable( + final List newContainersList) { + maybeInitBuilder(); + return new Iterable() { + @Override + public synchronized Iterator iterator() { + return new Iterator() { + + Iterator iter = newContainersList.iterator(); + + @Override + public synchronized boolean hasNext() { + return iter.hasNext(); + } + + @Override + public synchronized ResourceIncreaseContextProto next() { + return convertToProtoFormat(iter.next()); + } + + @Override + public synchronized void remove() { + throw new UnsupportedOperationException(); + + } + }; + + } + }; + } + + private synchronized Iterable getChangeProtoIterable( + final List newContainersList) { + maybeInitBuilder(); + return new Iterable() { + @Override + public synchronized Iterator iterator() { + return new Iterator() { + + Iterator iter = newContainersList.iterator(); + + @Override + public synchronized boolean hasNext() { + return iter.hasNext(); + } + + @Override + public synchronized ResourceChangeContextProto next() { + return convertToProtoFormat(iter.next()); + } + + @Override + public synchronized void remove() { + throw new UnsupportedOperationException(); + + } + }; + + } + }; + } + + private synchronized Iterable getContainerProtoIterable( final List newContainersList) { maybeInitBuilder(); return new Iterable() { @@ -486,6 +623,22 @@ private synchronized void initLocalFinishedContainerList() { completedContainersStatuses.add(convertFromProtoFormat(c)); } } + + private synchronized ResourceChangeContext convertFromProtoFormat(ResourceChangeContextProto p) { + return new ResourceChangeContextPBImpl(p); + } + + private synchronized ResourceChangeContextProto convertToProtoFormat(ResourceChangeContext t) { + return ((ResourceChangeContextPBImpl)t).getProto(); + } + + private synchronized ResourceIncreaseContext convertFromProtoFormat(ResourceIncreaseContextProto p) { + return new ResourceIncreaseContextPBImpl(p); + } + + private synchronized ResourceIncreaseContextProto convertToProtoFormat(ResourceIncreaseContext t) { + return ((ResourceIncreaseContextPBImpl)t).getProto(); + } private synchronized NodeReportPBImpl convertFromProtoFormat( NodeReportProto p) { @@ -500,8 +653,9 @@ private synchronized ContainerPBImpl convertFromProtoFormat( ContainerProto p) { return new ContainerPBImpl(p); } - - private synchronized ContainerProto convertToProtoFormat(Container t) { + + private synchronized ContainerProto convertToProtoFormat( + Container t) { return ((ContainerPBImpl)t).getProto(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestAllocateRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestAllocateRequest.java new file mode 100644 index 0000000..608e74e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestAllocateRequest.java @@ -0,0 +1,51 @@ +package org.apache.hadoop.yarn.api; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; + +import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.AllocateRequestPBImpl; +import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceChangeContext; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.AllocateRequestProto; +import org.junit.Test; + +public class TestAllocateRequest { + @Test + public void testAllcoateRequestWithIncrease() { + List incRequests = new ArrayList(); + for (int i = 0; i < 3; i++) { + incRequests.add(ResourceChangeContext.newInstance(null, Resource.newInstance(0, i))); + } + AllocateRequest r = AllocateRequest.newInstance(123, 0f, null, null, null, incRequests); + + // serde + AllocateRequestProto p = ((AllocateRequestPBImpl)r).getProto(); + r = new AllocateRequestPBImpl(p); + + // check value + Assert.assertEquals(123, r.getResponseId()); + Assert.assertEquals(incRequests.size(), r.getIncreaseRequests().size()); + + for (int i = 0; i < incRequests.size(); i++) { + Assert.assertEquals(r.getIncreaseRequests().get(i).getTargetCapability() + .getVirtualCores(), incRequests.get(i).getTargetCapability() + .getVirtualCores()); + } + } + + @Test + public void testAllcoateRequestWithoutIncrease() { + AllocateRequest r = AllocateRequest.newInstance(123, 0f, null, null, null, null); + + // serde + AllocateRequestProto p = ((AllocateRequestPBImpl)r).getProto(); + r = new AllocateRequestPBImpl(p); + + // check value + Assert.assertEquals(123, r.getResponseId()); + Assert.assertEquals(0, r.getIncreaseRequests().size()); + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestAllocateResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestAllocateResponse.java new file mode 100644 index 0000000..5dc8f6a --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestAllocateResponse.java @@ -0,0 +1,77 @@ +package org.apache.hadoop.yarn.api; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; + +import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.AllocateResponsePBImpl; +import org.apache.hadoop.yarn.api.records.AMCommand; +import org.apache.hadoop.yarn.api.records.Container; +import org.apache.hadoop.yarn.api.records.ContainerStatus; +import org.apache.hadoop.yarn.api.records.NMToken; +import org.apache.hadoop.yarn.api.records.NodeReport; +import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceChangeContext; +import org.apache.hadoop.yarn.api.records.ResourceIncreaseContext; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.AllocateResponseProto; +import org.junit.Test; + +public class TestAllocateResponse { + @Test + public void testAllocateResponseWithIncDecContainers() { + List incContainers = new ArrayList(); + List decContainers = new ArrayList(); + for (int i = 0; i < 3; i++) { + incContainers + .add(ResourceIncreaseContext.newInstance( + ResourceChangeContext.newInstance(null, + Resource.newInstance(1024, i)), null)); + } + for (int i = 0; i < 5; i++) { + decContainers + .add(ResourceChangeContext.newInstance(null, + Resource.newInstance(1024, i))); + } + + AllocateResponse r = AllocateResponse.newInstance(3, + new ArrayList(), new ArrayList(), + new ArrayList(), null, AMCommand.AM_RESYNC, 3, null, + new ArrayList(), incContainers, decContainers); + + // serde + AllocateResponseProto p = ((AllocateResponsePBImpl) r).getProto(); + r = new AllocateResponsePBImpl(p); + + // check value + Assert + .assertEquals(incContainers.size(), r.getIncreasedContainers().size()); + Assert + .assertEquals(decContainers.size(), r.getDecreasedContainers().size()); + + for (int i = 0; i < incContainers.size(); i++) { + Assert.assertEquals(i, r.getIncreasedContainers().get(i) + .getResourceChangeContext().getTargetCapability().getVirtualCores()); + } + + for (int i = 0; i < decContainers.size(); i++) { + Assert.assertEquals(i, r.getDecreasedContainers().get(i) + .getTargetCapability().getVirtualCores()); + } + } + + @Test + public void testAllocateResponseWithoutIncDecContainers() { + AllocateResponse r = AllocateResponse.newInstance(3, new ArrayList(), new ArrayList(), new ArrayList(), + null, AMCommand.AM_RESYNC, 3, null, new ArrayList(), null, null); + + // serde + AllocateResponseProto p = ((AllocateResponsePBImpl)r).getProto(); + r = new AllocateResponsePBImpl(p); + + // check value + Assert.assertEquals(0, r.getIncreasedContainers().size()); + Assert.assertEquals(0, r.getDecreasedContainers().size()); + } +}