Repository: aurora
Updated Branches:
  refs/heads/master 748babb92 -> c84d08146


Remove resource properties from ResourceAggregate

Bugs closed: AURORA-1975

Reviewed at https://reviews.apache.org/r/67077/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/c84d0814
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/c84d0814
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/c84d0814

Branch: refs/heads/master
Commit: c84d08146c183e2dcf83a4acbbbbe2da4cbaeec4
Parents: 748babb
Author: Jing Chen <[email protected]>
Authored: Thu Jun 14 13:35:50 2018 +0200
Committer: Stephan Erb <[email protected]>
Committed: Thu Jun 14 13:43:01 2018 +0200

----------------------------------------------------------------------
 RELEASE-NOTES.md                                |  1 +
 .../thrift/org/apache/aurora/gen/api.thrift     |  9 ---
 .../apache/aurora/scheduler/http/Quotas.java    | 20 +++++-
 .../aurora/scheduler/quota/QuotaManager.java    |  9 ++-
 .../storage/durability/ThriftBackfill.java      | 45 +++----------
 .../python/apache/aurora/client/api/__init__.py |  2 +-
 .../python/apache/aurora/config/resource.py     |  2 +-
 .../scheduler/resources/ResourceTestUtil.java   |  2 +-
 .../storage/durability/DurableStorageTest.java  | 11 ++--
 .../storage/durability/ThriftBackfillTest.java  | 31 ---------
 .../thrift/SchedulerThriftInterfaceTest.java    | 11 +---
 .../python/apache/aurora/admin/test_admin.py    | 16 ++++-
 .../apache/aurora/client/cli/test_quota.py      | 66 +++++++++++++++-----
 .../apache/aurora/config/test_resources.py      |  7 ++-
 .../durability/goldens/current/saveQuota        |  9 ---
 15 files changed, 114 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/RELEASE-NOTES.md
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 0ef75d6..5cb6959 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -29,6 +29,7 @@
   SLA-aware drain of the tasks, before marking the host as `DRAINED`. So 
maintenance requests
   survive across scheduler fail-overs. Use the newly introduced `aurora_admin 
sla_host_drain`
   to skip the SLA computations on the admin client.
+- Removed resource fields (`numCpus`, `ramMb`, `diskMb`) from 
ResourceAggregate.
 
 0.20.0
 ======

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/api/src/main/thrift/org/apache/aurora/gen/api.thrift
----------------------------------------------------------------------
diff --git a/api/src/main/thrift/org/apache/aurora/gen/api.thrift 
b/api/src/main/thrift/org/apache/aurora/gen/api.thrift
index 54007c8..7265b11 100644
--- a/api/src/main/thrift/org/apache/aurora/gen/api.thrift
+++ b/api/src/main/thrift/org/apache/aurora/gen/api.thrift
@@ -320,15 +320,6 @@ struct TaskConfig {
 }
 
 struct ResourceAggregate {
-  // TODO(maxim): Deprecated. See AURORA-1707.
-  /** Number of CPU cores allotted. */
-  1: double numCpus
-  // TODO(maxim): Deprecated. See AURORA-1707.
-  /** Megabytes of RAM allotted. */
-  2: i64 ramMb
-  // TODO(maxim): Deprecated. See AURORA-1707.
-  /** Megabytes of disk space allotted. */
-  3: i64 diskMb
   /** Aggregated resource values. */
   4: set<Resource> resources
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/main/java/org/apache/aurora/scheduler/http/Quotas.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/http/Quotas.java 
b/src/main/java/org/apache/aurora/scheduler/http/Quotas.java
index aa68c44..fd63ddd 100644
--- a/src/main/java/org/apache/aurora/scheduler/http/Quotas.java
+++ b/src/main/java/org/apache/aurora/scheduler/http/Quotas.java
@@ -16,6 +16,7 @@ package org.apache.aurora.scheduler.http;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 import javax.inject.Inject;
 import javax.ws.rs.GET;
@@ -29,10 +30,16 @@ import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 
+import org.apache.aurora.scheduler.resources.ResourceType;
 import org.apache.aurora.scheduler.storage.Storage;
+import org.apache.aurora.scheduler.storage.entities.IResource;
 import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
 import org.codehaus.jackson.annotate.JsonProperty;
 
+import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
+import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
+
 /**
  * Servlet that exposes allocated resource quotas.
  */
@@ -72,7 +79,18 @@ public class Quotas {
   }
 
   private static final Function<IResourceAggregate, ResourceAggregateBean> 
TO_BEAN =
-      quota -> new ResourceAggregateBean(quota.getNumCpus(), quota.getRamMb(), 
quota.getDiskMb());
+      quota -> new ResourceAggregateBean(
+          getResource(quota.getResources(), CPUS).getNumCpus(),
+          getResource(quota.getResources(), RAM_MB).getRamMb(),
+          getResource(quota.getResources(), DISK_MB).getDiskMb());
+
+  private static IResource getResource(Set<IResource> resources, ResourceType 
type) {
+    return resources.stream()
+        .filter(e -> ResourceType.fromResource(e).equals(type))
+        .findFirst()
+        .orElseThrow(() ->
+            new IllegalArgumentException("Missing resource definition for " + 
type));
+  }
 
   private static final class ResourceAggregateBean {
     private final double cpu;

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/main/java/org/apache/aurora/scheduler/quota/QuotaManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/quota/QuotaManager.java 
b/src/main/java/org/apache/aurora/scheduler/quota/QuotaManager.java
index e2750d7..19de66c 100644
--- a/src/main/java/org/apache/aurora/scheduler/quota/QuotaManager.java
+++ b/src/main/java/org/apache/aurora/scheduler/quota/QuotaManager.java
@@ -48,6 +48,7 @@ import 
org.apache.aurora.scheduler.storage.entities.IJobUpdate;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdateInstructions;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery;
 import org.apache.aurora.scheduler.storage.entities.IRange;
+import org.apache.aurora.scheduler.storage.entities.IResource;
 import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
 import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
 import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
@@ -168,8 +169,12 @@ public interface QuotaManager {
         final IResourceAggregate quota,
         MutableStoreProvider storeProvider) throws QuotaException {
 
-      if (quota.getNumCpus() < 0.0 || quota.getRamMb() < 0 || 
quota.getDiskMb() < 0) {
-        throw new QuotaException("Negative values in: " + quota.toString());
+      for (IResource resource : quota.getResources()) {
+        if (resource.isSetNumCpus() && resource.getNumCpus() < 0.0
+            || resource.isSetRamMb() && resource.getRamMb() < 0
+            || resource.isSetDiskMb() && resource.getDiskMb() < 0) {
+          throw new QuotaException("Negative values in: " + quota.toString());
+        }
       }
 
       QuotaInfo info = getQuotaInfo(ownerRole, Optional.empty(), 
storeProvider);

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/main/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfill.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfill.java
 
b/src/main/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfill.java
index 4425d02..41a2f0b 100644
--- 
a/src/main/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfill.java
+++ 
b/src/main/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfill.java
@@ -23,7 +23,6 @@ import org.apache.aurora.GuavaUtils;
 import org.apache.aurora.gen.JobConfiguration;
 import org.apache.aurora.gen.JobUpdate;
 import org.apache.aurora.gen.JobUpdateInstructions;
-import org.apache.aurora.gen.Resource;
 import org.apache.aurora.gen.ResourceAggregate;
 import org.apache.aurora.gen.ScheduledTask;
 import org.apache.aurora.gen.TaskConfig;
@@ -41,10 +40,6 @@ import 
org.apache.aurora.scheduler.storage.entities.ITaskConfig;
 import static java.lang.String.format;
 import static java.util.Objects.requireNonNull;
 
-import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
-import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
-import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
-
 /**
  * Helps migrating thrift schema by populating deprecated and/or replacement 
fields.
  */
@@ -57,14 +52,6 @@ public final class ThriftBackfill {
     this.tierManager = requireNonNull(tierManager);
   }
 
-  private static Resource getResource(Set<Resource> resources, ResourceType 
type) {
-    return resources.stream()
-            .filter(e -> 
ResourceType.fromResource(IResource.build(e)).equals(type))
-            .findFirst()
-            .orElseThrow(() ->
-                    new IllegalArgumentException("Missing resource definition 
for " + type));
-  }
-
   /**
    * Ensures TaskConfig.resources and correspondent task-level fields are all 
populated.
    *
@@ -125,28 +112,16 @@ public final class ThriftBackfill {
    * @return Backfilled IResourceAggregate.
    */
   public static IResourceAggregate backfillResourceAggregate(ResourceAggregate 
aggregate) {
-    if (!aggregate.isSetResources() || aggregate.getResources().isEmpty()) {
-      aggregate.addToResources(Resource.numCpus(aggregate.getNumCpus()));
-      aggregate.addToResources(Resource.ramMb(aggregate.getRamMb()));
-      aggregate.addToResources(Resource.diskMb(aggregate.getDiskMb()));
-    } else {
-      EnumSet<ResourceType> quotaResources = QuotaManager.QUOTA_RESOURCE_TYPES;
-      if (aggregate.getResources().size() > quotaResources.size()) {
-        throw new IllegalArgumentException("Too many resource values in 
quota.");
-      }
-
-      if (!quotaResources.equals(aggregate.getResources().stream()
-              .map(e -> ResourceType.fromResource(IResource.build(e)))
-              .collect(Collectors.toSet()))) {
-
-        throw new IllegalArgumentException("Quota resources must be exactly: " 
+ quotaResources);
-      }
-      aggregate.setNumCpus(
-              getResource(aggregate.getResources(), CPUS).getNumCpus());
-      aggregate.setRamMb(
-              getResource(aggregate.getResources(), RAM_MB).getRamMb());
-      aggregate.setDiskMb(
-              getResource(aggregate.getResources(), DISK_MB).getDiskMb());
+    EnumSet<ResourceType> quotaResources = QuotaManager.QUOTA_RESOURCE_TYPES;
+    if (aggregate.getResources().size() > quotaResources.size()) {
+      throw new IllegalArgumentException("Too many resource values in quota.");
+    }
+
+    if (!quotaResources.equals(aggregate.getResources().stream()
+        .map(e -> ResourceType.fromResource(IResource.build(e)))
+        .collect(Collectors.toSet()))) {
+
+      throw new IllegalArgumentException("Quota resources must be exactly: " + 
quotaResources);
     }
     return IResourceAggregate.build(aggregate);
   }

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/main/python/apache/aurora/client/api/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/client/api/__init__.py 
b/src/main/python/apache/aurora/client/api/__init__.py
index f1a82cb..34822bc 100644
--- a/src/main/python/apache/aurora/client/api/__init__.py
+++ b/src/main/python/apache/aurora/client/api/__init__.py
@@ -329,7 +329,7 @@ class AuroraClientAPI(object):
               % (role, cpu, ram, disk))
     return self._scheduler_proxy.setQuota(
         role,
-        ResourceAggregate(cpu, ram, disk, frozenset([
+        ResourceAggregate(frozenset([
             Resource(numCpus=cpu),
             Resource(ramMb=ram),
             Resource(diskMb=disk)])))

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/main/python/apache/aurora/config/resource.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/config/resource.py 
b/src/main/python/apache/aurora/config/resource.py
index b2ebd39..572205d 100644
--- a/src/main/python/apache/aurora/config/resource.py
+++ b/src/main/python/apache/aurora/config/resource.py
@@ -85,7 +85,7 @@ class ResourceManager(object):
 
   @classmethod
   def resource_details_from_quota(cls, quota):
-    return cls.resource_details(cls._backfill_resources(quota))
+    return cls.resource_details(quota.resources)
 
   @classmethod
   def resource_details_from_task(cls, task):

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java 
b/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
index 567586f..07b4e43 100644
--- a/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
+++ b/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
@@ -55,7 +55,7 @@ public final class ResourceTestUtil {
   }
 
   public static IResourceAggregate aggregate(double numCpus, long ramMb, long 
diskMb) {
-    return IResourceAggregate.build(new ResourceAggregate(numCpus, ramMb, 
diskMb, ImmutableSet.of(
+    return IResourceAggregate.build(new ResourceAggregate(ImmutableSet.of(
         numCpus(numCpus),
         ramMb(ramMb),
         diskMb(diskMb)

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/java/org/apache/aurora/scheduler/storage/durability/DurableStorageTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/storage/durability/DurableStorageTest.java
 
b/src/test/java/org/apache/aurora/scheduler/storage/durability/DurableStorageTest.java
index fcca9a5..ddb9d06 100644
--- 
a/src/test/java/org/apache/aurora/scheduler/storage/durability/DurableStorageTest.java
+++ 
b/src/test/java/org/apache/aurora/scheduler/storage/durability/DurableStorageTest.java
@@ -220,16 +220,13 @@ public class DurableStorageTest extends EasyMockTest {
     builder.add(Edit.op(Op.removeTasks(removeTasks)));
     storageUtil.taskStore.deleteTasks(removeTasks.getTaskIds());
 
-    ResourceAggregate nonBackfilled = new ResourceAggregate()
-        .setNumCpus(1.0)
-        .setRamMb(32)
-        .setDiskMb(64);
-    SaveQuota saveQuota = new SaveQuota(JOB_KEY.getRole(), nonBackfilled);
+    ResourceAggregate resourceAggregate = new ResourceAggregate()
+        .setResources(ImmutableSet.of(numCpus(1.0), ramMb(32), diskMb(64)));
+    SaveQuota saveQuota = new SaveQuota(JOB_KEY.getRole(), resourceAggregate);
     builder.add(Edit.op(Op.saveQuota(saveQuota)));
     storageUtil.quotaStore.saveQuota(
         saveQuota.getRole(),
-        IResourceAggregate.build(nonBackfilled.deepCopy()
-            .setResources(ImmutableSet.of(numCpus(1.0), ramMb(32), 
diskMb(64)))));
+        IResourceAggregate.build(resourceAggregate));
 
     builder.add(Edit.op(Op.removeQuota(new RemoveQuota(JOB_KEY.getRole()))));
     storageUtil.quotaStore.removeQuota(JOB_KEY.getRole());

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfillTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfillTest.java
 
b/src/test/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfillTest.java
index 219576b..22131bd 100644
--- 
a/src/test/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfillTest.java
+++ 
b/src/test/java/org/apache/aurora/scheduler/storage/durability/ThriftBackfillTest.java
@@ -21,7 +21,6 @@ import org.apache.aurora.gen.ResourceAggregate;
 import org.apache.aurora.gen.TaskConfig;
 import org.apache.aurora.scheduler.TierManager;
 import org.apache.aurora.scheduler.base.TaskTestUtil;
-import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
 import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
 import org.junit.Before;
 import org.junit.Test;
@@ -65,36 +64,6 @@ public class ThriftBackfillTest extends EasyMockTest {
         thriftBackfill.backfillTask(config));
   }
 
-  @Test
-  public void testResourceAggregateFieldsToSet() {
-    control.replay();
-
-    ResourceAggregate aggregate = new ResourceAggregate()
-        .setNumCpus(1.0)
-        .setRamMb(32)
-        .setDiskMb(64);
-
-    IResourceAggregate expected = IResourceAggregate.build(aggregate.deepCopy()
-        .setResources(ImmutableSet.of(numCpus(1.0), ramMb(32), diskMb(64))));
-
-    assertEquals(expected, 
ThriftBackfill.backfillResourceAggregate(aggregate));
-  }
-
-  @Test
-  public void testResourceAggregateSetToFields() {
-    control.replay();
-
-    ResourceAggregate aggregate = new ResourceAggregate()
-        .setResources(ImmutableSet.of(numCpus(1.0), ramMb(32), diskMb(64)));
-
-    IResourceAggregate expected = IResourceAggregate.build(aggregate.deepCopy()
-        .setNumCpus(1.0)
-        .setRamMb(32)
-        .setDiskMb(64));
-
-    assertEquals(expected, 
ThriftBackfill.backfillResourceAggregate(aggregate));
-  }
-
   @Test(expected = IllegalArgumentException.class)
   public void testResourceAggregateTooManyResources() {
     control.replay();

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
 
b/src/test/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
index 0fc3673..aa1cb2b 100644
--- 
a/src/test/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
+++ 
b/src/test/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
@@ -730,13 +730,10 @@ public class SchedulerThriftInterfaceTest extends 
EasyMockTest {
   @Test
   public void testSetQuota() throws Exception {
     ResourceAggregate resourceAggregate = new ResourceAggregate()
-        .setNumCpus(10)
-        .setDiskMb(100)
-        .setRamMb(200);
+        .setResources(ImmutableSet.of(numCpus(10.0), ramMb(200), diskMb(100)));
     quotaManager.saveQuota(
         ROLE,
-        IResourceAggregate.build(resourceAggregate.deepCopy()
-            .setResources(ImmutableSet.of(numCpus(10), ramMb(200), 
diskMb(100)))),
+        IResourceAggregate.build(resourceAggregate),
         storageUtil.mutableStoreProvider);
 
     control.replay();
@@ -747,9 +744,7 @@ public class SchedulerThriftInterfaceTest extends 
EasyMockTest {
   @Test
   public void testSetQuotaFails() throws Exception {
     ResourceAggregate resourceAggregate = new ResourceAggregate()
-        .setNumCpus(10)
-        .setDiskMb(100)
-        .setRamMb(200);
+        .setResources(ImmutableSet.of(numCpus(10.0), ramMb(200), diskMb(100)));
     quotaManager.saveQuota(
         ROLE,
         IResourceAggregate.build(resourceAggregate.deepCopy()

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/python/apache/aurora/admin/test_admin.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/admin/test_admin.py 
b/src/test/python/apache/aurora/admin/test_admin.py
index ebe89b5..1c54d09 100644
--- a/src/test/python/apache/aurora/admin/test_admin.py
+++ b/src/test/python/apache/aurora/admin/test_admin.py
@@ -33,6 +33,7 @@ from gen.apache.aurora.api.ttypes import (
     AssignedTask,
     GetQuotaResult,
     JobKey,
+    Resource,
     ResourceAggregate,
     Response,
     ResponseCode,
@@ -194,9 +195,18 @@ class TestIncreaseQuotaCommand(AuroraClientCommandTest):
       api = mock_make_admin_client.return_value
       role = 'test_role'
       api.get_quota.return_value = self.create_response(
-          ResourceAggregate(20.0, 4000, 6000),
-          ResourceAggregate(15.0, 2000, 3000),
-          ResourceAggregate(6.0, 200, 600),
+          ResourceAggregate(resources=frozenset([
+              Resource(numCpus=20.0),
+              Resource(ramMb=4000),
+              Resource(diskMb=6000)])),
+          ResourceAggregate(resources=frozenset([
+              Resource(numCpus=15.0),
+              Resource(ramMb=2000),
+              Resource(diskMb=3000)])),
+          ResourceAggregate(resources=frozenset([
+              Resource(numCpus=6.0),
+              Resource(ramMb=200),
+              Resource(diskMb=600)])),
       )
       api.set_quota.return_value = self.create_simple_success_response()
 

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/python/apache/aurora/client/cli/test_quota.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/cli/test_quota.py 
b/src/test/python/apache/aurora/client/cli/test_quota.py
index b566296..bf831bd 100644
--- a/src/test/python/apache/aurora/client/cli/test_quota.py
+++ b/src/test/python/apache/aurora/client/cli/test_quota.py
@@ -20,7 +20,7 @@ from apache.aurora.client.cli.client import AuroraCommandLine
 
 from .util import AuroraClientCommandTest, FakeAuroraCommandContext
 
-from gen.apache.aurora.api.ttypes import GetQuotaResult, ResourceAggregate, 
Result
+from gen.apache.aurora.api.ttypes import GetQuotaResult, Resource, 
ResourceAggregate, Result
 
 
 class TestGetQuotaCommand(AuroraClientCommandTest):
@@ -29,7 +29,10 @@ class TestGetQuotaCommand(AuroraClientCommandTest):
     api = mock_context.get_api('west')
     response = cls.create_simple_success_response()
     response.result = Result(getQuotaResult=GetQuotaResult(
-        quota=ResourceAggregate(numCpus=5, ramMb=20480, diskMb=40960),
+        quota=ResourceAggregate(resources=frozenset([
+            Resource(numCpus=5),
+            Resource(ramMb=20480),
+            Resource(diskMb=40960)])),
         prodSharedConsumption=None,
         prodDedicatedConsumption=None,
         nonProdSharedConsumption=None,
@@ -42,11 +45,26 @@ class TestGetQuotaCommand(AuroraClientCommandTest):
     api = mock_context.get_api('west')
     response = cls.create_simple_success_response()
     response.result = Result(getQuotaResult=GetQuotaResult(
-      quota=ResourceAggregate(numCpus=5, ramMb=20480, diskMb=40960),
-      prodSharedConsumption=ResourceAggregate(numCpus=1, ramMb=512, 
diskMb=1024),
-      prodDedicatedConsumption=ResourceAggregate(numCpus=2, ramMb=1024, 
diskMb=2048),
-      nonProdSharedConsumption=ResourceAggregate(numCpus=3, ramMb=2048, 
diskMb=4096),
-      nonProdDedicatedConsumption=ResourceAggregate(numCpus=4, ramMb=4096, 
diskMb=8192),
+      quota=ResourceAggregate(resources=frozenset([
+          Resource(numCpus=5),
+          Resource(ramMb=20480),
+          Resource(diskMb=40960)])),
+      prodSharedConsumption=ResourceAggregate(resources=frozenset([
+          Resource(numCpus=1),
+          Resource(ramMb=512),
+          Resource(diskMb=1024)])),
+      prodDedicatedConsumption=ResourceAggregate(resources=frozenset([
+          Resource(numCpus=2),
+          Resource(ramMb=1024),
+          Resource(diskMb=2048)])),
+      nonProdSharedConsumption=ResourceAggregate(resources=frozenset([
+          Resource(numCpus=3),
+          Resource(ramMb=2048),
+          Resource(diskMb=4096)])),
+      nonProdDedicatedConsumption=ResourceAggregate(resources=frozenset([
+          Resource(numCpus=4),
+          Resource(ramMb=4096),
+          Resource(diskMb=8192)])),
     ))
     api.get_quota.return_value = response
 
@@ -67,18 +85,22 @@ class TestGetQuotaCommand(AuroraClientCommandTest):
     assert expected_output == self._get_quota(True, ['quota', 'get', 
'west/bozo'])
 
   def test_get_quota_with_no_consumption_json(self):
-    assert (json.loads('{"quota":{"numCpus":5,"ramMb":20480,"diskMb":40960}}') 
==
-            json.loads(self._get_quota(False, ['quota', 'get', '--write-json', 
'west/bozo'])))
+    expected_response = self._response_converter(
+        
(json.loads('{"quota":{"resources":[{"diskMb":40960},{"numCpus":5},{"ramMb":20480}]}}')))
+    actual_response = self._response_converter(
+        json.loads(self._get_quota(False, ['quota', 'get', '--write-json', 
'west/bozo'])))
+    assert (expected_response == actual_response)
 
   def test_get_quota_with_consumption_json(self):
-    expected_response = json.loads(
-        '{"quota":{"numCpus":5,"ramMb":20480,"diskMb":40960},'
-        '"prodSharedConsumption":{"numCpus":1,"ramMb":512,"diskMb":1024},'
-        '"prodDedicatedConsumption":{"numCpus":2,"ramMb":1024,"diskMb":2048},'
-        '"nonProdSharedConsumption":{"numCpus":3,"ramMb":2048,"diskMb":4096},'
-        
'"nonProdDedicatedConsumption":{"numCpus":4,"ramMb":4096,"diskMb":8192}}')
-    assert (expected_response ==
-            json.loads(self._get_quota(True, ['quota', 'get', '--write-json', 
'west/bozo'])))
+    expected_response = self._response_converter(json.loads(
+        
'{"quota":{"resources":[{"numCpus":5},{"ramMb":20480},{"diskMb":40960}]},'
+        
'"prodSharedConsumption":{"resources":[{"numCpus":1},{"ramMb":512},{"diskMb":1024}]},'
+        
'"prodDedicatedConsumption":{"resources":[{"numCpus":2},{"ramMb":1024},{"diskMb":2048}]},'
+        
'"nonProdSharedConsumption":{"resources":[{"numCpus":3},{"ramMb":2048},{"diskMb":4096}]},'
+        '"nonProdDedicatedConsumption":{"resources":'
+        '[{"numCpus":4},{"ramMb":4096},{"diskMb":8192}]}}'))
+    assert (expected_response == self._response_converter(
+      json.loads(self._get_quota(True, ['quota', 'get', '--write-json', 
'west/bozo']))))
 
   def test_get_quota_failed(self):
     fake_context = FakeAuroraCommandContext()
@@ -104,3 +126,13 @@ class TestGetQuotaCommand(AuroraClientCommandTest):
       cmd.execute(command_args)
       out = '\n'.join(mock_context.get_out())
       return out
+
+  def _response_converter(self, response):
+    resources_list = []
+    for key in response:
+      if 'resources' in response[key] and response[key]['resources'] is not 
None:
+        for resource in response[key]['resources']:
+          resources_list += resource.items()
+      response[key]['resources'] = sorted(resources_list, key=lambda x: (x[0], 
x[1]))
+      resources_list = []
+    return response

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/python/apache/aurora/config/test_resources.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/config/test_resources.py 
b/src/test/python/apache/aurora/config/test_resources.py
index 3ac5490..988ab33 100644
--- a/src/test/python/apache/aurora/config/test_resources.py
+++ b/src/test/python/apache/aurora/config/test_resources.py
@@ -47,8 +47,11 @@ class TestResourceManager(unittest.TestCase):
         ResourceType.CPUS)
     assert quantity == 1.0
 
-  def test_backfill_quota(self):
-    quota = ResourceAggregate(numCpus=1.0, ramMb=2, diskMb=3)
+  def test_quota(self):
+    quota = ResourceAggregate(resources={
+        Resource(numCpus=1.0),
+        Resource(ramMb=2),
+        Resource(diskMb=3)})
     assert ResourceManager.resource_details_from_quota(quota) == [
         ResourceDetails(ResourceType.CPUS, 1.0),
         ResourceDetails(ResourceType.RAM_MB, 2),

http://git-wip-us.apache.org/repos/asf/aurora/blob/c84d0814/src/test/resources/org/apache/aurora/scheduler/storage/durability/goldens/current/saveQuota
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/aurora/scheduler/storage/durability/goldens/current/saveQuota
 
b/src/test/resources/org/apache/aurora/scheduler/storage/durability/goldens/current/saveQuota
index 6b0d800..e7aa38c 100644
--- 
a/src/test/resources/org/apache/aurora/scheduler/storage/durability/goldens/current/saveQuota
+++ 
b/src/test/resources/org/apache/aurora/scheduler/storage/durability/goldens/current/saveQuota
@@ -6,15 +6,6 @@
       },
       "2": {
         "rec": {
-          "1": {
-            "dbl": 8.0
-          },
-          "2": {
-            "i64": 4
-          },
-          "3": {
-            "i64": 4
-          },
           "4": {
             "set": [
               "rec",

Reply via email to