TEST(ResourcesTest, ScalarSubtraction) { Resource cpus1 = Resources::parse("cpus", "50", "*").get(); Resource mem1 = Resources::parse("mem", "4096", "*").get(); Resource cpus2 = Resources::parse("cpus", "0.5", "*").get(); Resource mem2 = Resources::parse("mem", "1024", "*").get(); Resources r1; r1 += cpus1; r1 += mem1; Resources r2; r2 += cpus2; r2 += mem2; Resources diff = r1 - r2; EXPECT_FALSE(diff.empty()); EXPECT_EQ(49.5, diff.get<Value::Scalar>("cpus").get().value()); EXPECT_EQ(3072, diff.get<Value::Scalar>("mem").get().value()); Resources r = r1; r -= r2; EXPECT_EQ(49.5, diff.get<Value::Scalar>("cpus").get().value()); EXPECT_EQ(3072, diff.get<Value::Scalar>("mem").get().value()); r = r1; r -= r1; EXPECT_TRUE(r.empty()); }
TEST(ResourcesTest, ScalarAddition) { Resource cpus1 = Resources::parse("cpus", "1", "*").get(); Resource mem1 = Resources::parse("mem", "5", "*").get(); Resource cpus2 = Resources::parse("cpus", "2", "*").get(); Resource mem2 = Resources::parse("mem", "10", "*").get(); Resources r1; r1 += cpus1; r1 += mem1; Resources r2; r2 += cpus2; r2 += mem2; Resources sum = r1 + r2; EXPECT_FALSE(sum.empty()); EXPECT_EQ(3, sum.get<Value::Scalar>("cpus").get().value()); EXPECT_EQ(15, sum.get<Value::Scalar>("mem").get().value()); Resources r = r1; r += r2; EXPECT_FALSE(r.empty()); EXPECT_EQ(3, r.get<Value::Scalar>("cpus").get().value()); EXPECT_EQ(15, r.get<Value::Scalar>("mem").get().value()); }
void RandomSorter::remove(const SlaveID& slaveId, const Resources& resources) { if (!resources.empty()) { CHECK(total_.resources.contains(slaveId)); CHECK(total_.resources[slaveId].contains(resources)) << total_.resources[slaveId] << " does not contain " << resources; total_.resources[slaveId] -= resources; // Remove shared resources from the total quantities when there // are no instances of same resources left in the total. const Resources absentShared = resources.shared() .filter([this, slaveId](const Resource& resource) { return !total_.resources[slaveId].contains(resource); }); const ResourceQuantities scalarQuantities = ResourceQuantities::fromScalarResources( (resources.nonShared() + absentShared).scalars()); CHECK(total_.totals.contains(scalarQuantities)); total_.totals -= scalarQuantities; if (total_.resources[slaveId].empty()) { total_.resources.erase(slaveId); } } }
ACTION_P(BasicTestAction, check) { Resources resources = arg0; if (utils::AlmostZero(check)) { EXPECT_TRUE(resources.empty()); } else { EXPECT_FALSE(resources.empty()); // if is used here, because gmock can not use ASSERT inside ACTION if (!resources.empty()) { EXPECT_THAT(resources.begin()->scalar().value(), DoubleEq(check)); EXPECT_THAT(++resources.begin(), Eq(resources.end())); } } return Nothing(); }
TEST(ResourcesTest, BadResourcesNotAllocatable) { Resource cpus; cpus.set_type(Value::SCALAR); cpus.mutable_scalar()->set_value(1); Resources r; r += cpus; EXPECT_TRUE(r.empty()); cpus.set_name("cpus"); cpus.mutable_scalar()->set_value(0); r += cpus; EXPECT_TRUE(r.empty()); }
TEST(ResourcesTest, RangesSubtraction4) { Resources resources = Resources::parse("ports:[50000-60000]").get(); Resources resourcesOffered; resourcesOffered += resources; resourcesOffered -= resources; EXPECT_TRUE(resourcesOffered.empty()); EXPECT_NONE(resourcesOffered.get<Value::Ranges>("ports")); }
void DRFSorter::add(const SlaveID& slaveId, const Resources& resources) { if (!resources.empty()) { total_.resources[slaveId] += resources; total_.scalarQuantities += resources.createStrippedScalarQuantity(); // We have to recalculate all shares when the total resources // change, but we put it off until sort is called so that if // something else changes before the next allocation we don't // recalculate everything twice. dirty = true; } }
TEST(ResourcesTest, RangesAddition2) { Resource ports1 = Resources::parse("ports", "[1-10, 5-30, 50-60]", "*").get(); Resource ports2 = Resources::parse("ports", "[1-65, 70-80]", "*").get(); Resources r; r += ports1; r += ports2; EXPECT_FALSE(r.empty()); EXPECT_SOME_EQ( values::parse("[1-65, 70-80]").get().ranges(), r.get<Value::Ranges>("ports")); }
TEST(ResourcesTest, RangesSubtraction3) { Resources resources = Resources::parse("ports:[50000-60000]").get(); Resources resourcesOffered = Resources::parse("").get(); Resources resourcesInUse = Resources::parse("ports:[50000-50001]").get(); Resources resourcesFree = resources - (resourcesOffered + resourcesInUse); EXPECT_FALSE(resourcesFree.empty()); EXPECT_SOME_EQ( values::parse("[50002-60000]").get().ranges(), resourcesFree.get<Value::Ranges>("ports")); }
void DRFSorter::remove(const SlaveID& slaveId, const Resources& resources) { if (!resources.empty()) { CHECK(total_.resources.contains(slaveId)); total_.resources[slaveId] -= resources; total_.scalarQuantities -= resources.createStrippedScalarQuantity(); if (total_.resources[slaveId].empty()) { total_.resources.erase(slaveId); } dirty = true; } }
void DRFSorter::remove(const SlaveID& slaveId, const Resources& resources) { if (!resources.empty()) { CHECK(total.resources.contains(slaveId)); total.resources[slaveId] -= resources; total.scalars -= resources.scalars(); if (total.resources[slaveId].empty()) { total.resources.erase(slaveId); } dirty = true; } }
TEST(ResourcesTest, RangesSubtraction6) { Resource ports1 = Resources::parse("ports", "[1-10]", "*").get(); Resource ports2 = Resources::parse("ports", "[11-20]", "*").get(); Resources r; r += ports1; r -= ports2; EXPECT_FALSE(r.empty()); EXPECT_SOME_EQ( values::parse("[1-10]").get().ranges(), r.get<Value::Ranges>("ports")); }
TEST(ResourcesTest, RangesAddition) { Resource ports1 = Resources::parse( "ports", "[20000-40000]", "*").get(); Resource ports2 = Resources::parse( "ports", "[30000-50000, 10000-20000]", "*").get(); Resources r; r += ports1; r += ports2; EXPECT_FALSE(r.empty()); EXPECT_SOME_EQ( values::parse("[10000-50000]").get().ranges(), r.get<Value::Ranges>("ports")); }
TEST(ResourcesTest, RangesSubtraction5) { Resource ports1 = Resources::parse( "ports", "[1-10, 20-30, 40-50]", "*").get(); Resource ports2 = Resources::parse( "ports", "[2-9, 15-45, 48-50]", "*").get(); Resources r; r += ports1; r -= ports2; EXPECT_FALSE(r.empty()); EXPECT_SOME_EQ( values::parse("[1-1, 10-10, 46-47]").get().ranges(), r.get<Value::Ranges>("ports")); }
TEST(ResourcesTest, RangesAddition4) { Resource ports1 = Resources::parse( "ports", "[1-4, 9-10, 20-22, 26-30]", "*").get(); Resource ports2 = Resources::parse( "ports", "[5-8, 23-25]", "*").get(); Resources r; r += ports1; r += ports2; EXPECT_FALSE(r.empty()); EXPECT_SOME_EQ( values::parse("[1-10, 20-30]").get().ranges(), r.get<Value::Ranges>("ports")); }
TEST(ResourcesTest, ScalarAddition2) { Resource cpus1 = Resources::parse("cpus", "1", "role1").get(); Resource cpus2 = Resources::parse("cpus", "3", "role2").get(); Resource cpus3 = Resources::parse("cpus", "5", "role1").get(); Resources r1; r1 += cpus1; r1 += cpus2; Resources r2; r2 += cpus3; Resources sum = r1 + r2; EXPECT_FALSE(sum.empty()); EXPECT_EQ(9, sum.cpus().get()); EXPECT_EQ(sum, Resources::parse("cpus(role1):6;cpus(role2):3").get()); }
TEST(ResourcesTest, ScalarSubtraction2) { Resource cpus1 = Resources::parse("cpus", "5", "role1").get(); Resource cpus2 = Resources::parse("cpus", "3", "role2").get(); Resource cpus3 = Resources::parse("cpus", "1", "role1").get(); Resources r1; r1 += cpus1; r1 += cpus2; Resources r2; r2 += cpus3; Resources diff = r1 - r2; EXPECT_FALSE(diff.empty()); EXPECT_EQ(7, diff.cpus().get()); EXPECT_EQ(diff, Resources::parse("cpus(role1):4;cpus(role2):3").get()); }
void RandomSorter::add(const SlaveID& slaveId, const Resources& resources) { if (!resources.empty()) { // Add shared resources to the total quantities when the same // resources don't already exist in the total. const Resources newShared = resources.shared() .filter([this, slaveId](const Resource& resource) { return !total_.resources[slaveId].contains(resource); }); total_.resources[slaveId] += resources; const ResourceQuantities scalarQuantities = ResourceQuantities::fromScalarResources( (resources.nonShared() + newShared).scalars()); total_.totals += scalarQuantities; } }
TEST(ResourcesTest, SetAddition) { Resource disks1 = Resources::parse( "disks", "{sda1,sda2,sda3}", "*").get(); Resource disks2 = Resources::parse( "disks", "{sda1,sda2,sda3,sda4}", "*").get(); Resources r; r += disks1; r += disks2; EXPECT_FALSE(r.empty()); Option<Value::Set> set = r.get<Value::Set>("disks"); ASSERT_SOME(set); EXPECT_EQ(4, set.get().item_size()); }
TEST(ResourcesTest, InitializedIsEmpty) { Resources r; EXPECT_TRUE(r.empty()); }