Committed by
Naoki Shiota
Made ResourceManager to accept arbitrary ResourceConsumer implementation. (ONOS-4406)
Change-Id: If41564824770c2a8b78237a206c036df94141117
Showing
15 changed files
with
276 additions
and
56 deletions
... | @@ -40,6 +40,7 @@ import org.onosproject.net.PortNumber; | ... | @@ -40,6 +40,7 @@ import org.onosproject.net.PortNumber; |
40 | import org.onosproject.net.TributarySlot; | 40 | import org.onosproject.net.TributarySlot; |
41 | import org.onosproject.net.device.DeviceService; | 41 | import org.onosproject.net.device.DeviceService; |
42 | import org.onosproject.net.intent.IntentId; | 42 | import org.onosproject.net.intent.IntentId; |
43 | +import org.onosproject.net.resource.ResourceConsumerId; | ||
43 | import org.onosproject.net.resource.Resources; | 44 | import org.onosproject.net.resource.Resources; |
44 | import org.onosproject.net.resource.DiscreteResourceId; | 45 | import org.onosproject.net.resource.DiscreteResourceId; |
45 | import org.onosproject.net.resource.ResourceAllocation; | 46 | import org.onosproject.net.resource.ResourceAllocation; |
... | @@ -145,15 +146,15 @@ public class AllocationsCommand extends AbstractShellCommand { | ... | @@ -145,15 +146,15 @@ public class AllocationsCommand extends AbstractShellCommand { |
145 | resourceService.getResourceAllocations(resourceId, t).stream() | 146 | resourceService.getResourceAllocations(resourceId, t).stream() |
146 | .filter(a -> isSubjectToPrint(a)) | 147 | .filter(a -> isSubjectToPrint(a)) |
147 | .forEach(a -> print("%s%s allocated by %s", Strings.repeat(" ", level + 1), | 148 | .forEach(a -> print("%s%s allocated by %s", Strings.repeat(" ", level + 1), |
148 | - a.resource().valueAs(Object.class).orElse(""), asVerboseString(a.consumer()))); | 149 | + a.resource().valueAs(Object.class).orElse(""), asVerboseString(a.consumerId()))); |
149 | 150 | ||
150 | } | 151 | } |
151 | } | 152 | } |
152 | 153 | ||
153 | private boolean isSubjectToPrint(ResourceAllocation allocation) { | 154 | private boolean isSubjectToPrint(ResourceAllocation allocation) { |
154 | if (!intentsToPrint.isEmpty() | 155 | if (!intentsToPrint.isEmpty() |
155 | - && allocation.consumer() instanceof IntentId | 156 | + && allocation.consumerId().isClassOf(IntentId.class) |
156 | - && !intentsToPrint.contains(allocation.consumer().toString())) { | 157 | + && !intentsToPrint.contains(allocation.consumerId().toString())) { |
157 | return false; | 158 | return false; |
158 | } | 159 | } |
159 | 160 | ||
... | @@ -184,4 +185,8 @@ public class AllocationsCommand extends AbstractShellCommand { | ... | @@ -184,4 +185,8 @@ public class AllocationsCommand extends AbstractShellCommand { |
184 | } | 185 | } |
185 | } | 186 | } |
186 | 187 | ||
188 | + private static String asVerboseString(ResourceConsumerId consumerId) { | ||
189 | + return String.format("%s:%s", consumerId.consumerClass(), consumerId.value()); | ||
190 | + } | ||
191 | + | ||
187 | } | 192 | } | ... | ... |
... | @@ -18,6 +18,7 @@ package org.onosproject.net.intent; | ... | @@ -18,6 +18,7 @@ package org.onosproject.net.intent; |
18 | import com.google.common.annotations.Beta; | 18 | import com.google.common.annotations.Beta; |
19 | import org.onlab.util.Identifier; | 19 | import org.onlab.util.Identifier; |
20 | import org.onosproject.net.resource.ResourceConsumer; | 20 | import org.onosproject.net.resource.ResourceConsumer; |
21 | +import org.onosproject.net.resource.ResourceConsumerId; | ||
21 | 22 | ||
22 | /** | 23 | /** |
23 | * Intent identifier suitable as an external key. | 24 | * Intent identifier suitable as an external key. |
... | @@ -66,4 +67,8 @@ public final class IntentId extends Identifier<Long> implements ResourceConsumer | ... | @@ -66,4 +67,8 @@ public final class IntentId extends Identifier<Long> implements ResourceConsumer |
66 | return "0x" + Long.toHexString(identifier); | 67 | return "0x" + Long.toHexString(identifier); |
67 | } | 68 | } |
68 | 69 | ||
70 | + @Override | ||
71 | + public ResourceConsumerId consumerId() { | ||
72 | + return ResourceConsumerId.of(this); | ||
73 | + } | ||
69 | } | 74 | } | ... | ... |
... | @@ -29,7 +29,18 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -29,7 +29,18 @@ import static com.google.common.base.Preconditions.checkNotNull; |
29 | public class ResourceAllocation { | 29 | public class ResourceAllocation { |
30 | 30 | ||
31 | private final Resource resource; | 31 | private final Resource resource; |
32 | - private final ResourceConsumer consumer; | 32 | + private final ResourceConsumerId consumerId; |
33 | + | ||
34 | + /** | ||
35 | + * Creates an instance with the specified subject, resource and consumerId. | ||
36 | + * | ||
37 | + * @param resource resource of the subject | ||
38 | + * @param consumerId consumer ID of this resource | ||
39 | + */ | ||
40 | + public ResourceAllocation(Resource resource, ResourceConsumerId consumerId) { | ||
41 | + this.resource = checkNotNull(resource); | ||
42 | + this.consumerId = checkNotNull(consumerId); | ||
43 | + } | ||
33 | 44 | ||
34 | /** | 45 | /** |
35 | * Creates an instance with the specified subject, resource and consumer. | 46 | * Creates an instance with the specified subject, resource and consumer. |
... | @@ -38,14 +49,13 @@ public class ResourceAllocation { | ... | @@ -38,14 +49,13 @@ public class ResourceAllocation { |
38 | * @param consumer consumer of this resource | 49 | * @param consumer consumer of this resource |
39 | */ | 50 | */ |
40 | public ResourceAllocation(Resource resource, ResourceConsumer consumer) { | 51 | public ResourceAllocation(Resource resource, ResourceConsumer consumer) { |
41 | - this.resource = checkNotNull(resource); | 52 | + this(resource, checkNotNull(consumer).consumerId()); |
42 | - this.consumer = consumer; | ||
43 | } | 53 | } |
44 | 54 | ||
45 | // for serialization | 55 | // for serialization |
46 | private ResourceAllocation() { | 56 | private ResourceAllocation() { |
47 | this.resource = null; | 57 | this.resource = null; |
48 | - this.consumer = null; | 58 | + this.consumerId = null; |
49 | } | 59 | } |
50 | 60 | ||
51 | /** | 61 | /** |
... | @@ -58,17 +68,17 @@ public class ResourceAllocation { | ... | @@ -58,17 +68,17 @@ public class ResourceAllocation { |
58 | } | 68 | } |
59 | 69 | ||
60 | /** | 70 | /** |
61 | - * Returns the consumer of this resource. | 71 | + * Returns ID of the consumer of this resource. |
62 | * | 72 | * |
63 | - * @return the consumer of this resource | 73 | + * @return ID of the consumer of this resource |
64 | */ | 74 | */ |
65 | - public ResourceConsumer consumer() { | 75 | + public ResourceConsumerId consumerId() { |
66 | - return consumer; | 76 | + return consumerId; |
67 | } | 77 | } |
68 | 78 | ||
69 | @Override | 79 | @Override |
70 | public int hashCode() { | 80 | public int hashCode() { |
71 | - return Objects.hash(resource, consumer); | 81 | + return Objects.hash(resource, consumerId); |
72 | } | 82 | } |
73 | 83 | ||
74 | @Override | 84 | @Override |
... | @@ -81,14 +91,14 @@ public class ResourceAllocation { | ... | @@ -81,14 +91,14 @@ public class ResourceAllocation { |
81 | } | 91 | } |
82 | final ResourceAllocation that = (ResourceAllocation) obj; | 92 | final ResourceAllocation that = (ResourceAllocation) obj; |
83 | return Objects.equals(this.resource, that.resource) | 93 | return Objects.equals(this.resource, that.resource) |
84 | - && Objects.equals(this.consumer, that.consumer); | 94 | + && Objects.equals(this.consumerId, that.consumerId); |
85 | } | 95 | } |
86 | 96 | ||
87 | @Override | 97 | @Override |
88 | public String toString() { | 98 | public String toString() { |
89 | return MoreObjects.toStringHelper(this) | 99 | return MoreObjects.toStringHelper(this) |
90 | .add("resource", resource) | 100 | .add("resource", resource) |
91 | - .add("consumer", consumer) | 101 | + .add("consumerId", consumerId) |
92 | .toString(); | 102 | .toString(); |
93 | } | 103 | } |
94 | } | 104 | } | ... | ... |
... | @@ -22,4 +22,10 @@ import com.google.common.annotations.Beta; | ... | @@ -22,4 +22,10 @@ import com.google.common.annotations.Beta; |
22 | */ | 22 | */ |
23 | @Beta | 23 | @Beta |
24 | public interface ResourceConsumer { | 24 | public interface ResourceConsumer { |
25 | + /** | ||
26 | + * Returns ID of this consumer. | ||
27 | + * | ||
28 | + * @return ID of this consumer | ||
29 | + */ | ||
30 | + ResourceConsumerId consumerId(); | ||
25 | } | 31 | } | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.net.resource; | ||
18 | + | ||
19 | +import com.google.common.base.Objects; | ||
20 | +import org.onlab.util.Identifier; | ||
21 | + | ||
22 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
23 | + | ||
24 | +/** | ||
25 | + * Representation of global unique ID for ResourceConsumer object. | ||
26 | + */ | ||
27 | +public class ResourceConsumerId { | ||
28 | + private final String className; | ||
29 | + private final long value; | ||
30 | + | ||
31 | + // Constructor for serializer. | ||
32 | + protected ResourceConsumerId() { | ||
33 | + this.className = null; | ||
34 | + this.value = 0L; | ||
35 | + } | ||
36 | + | ||
37 | + /** | ||
38 | + * Constructor with specifying every fields. | ||
39 | + * | ||
40 | + * @param value ID value unique within the given class | ||
41 | + * @param cls class of ResourceConsumer implementation | ||
42 | + */ | ||
43 | + ResourceConsumerId(long value, Class<?> cls) { | ||
44 | + this.className = checkNotNull(cls.getName()); | ||
45 | + this.value = value; | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * Checks if the consumer is an instance of given class. | ||
50 | + * | ||
51 | + * @param cls class object | ||
52 | + * @return result of check | ||
53 | + */ | ||
54 | + public boolean isClassOf(Class<?> cls) { | ||
55 | + return checkNotNull(cls).getName().equals(className); | ||
56 | + } | ||
57 | + | ||
58 | + /** | ||
59 | + * Returns class name of the consumer. | ||
60 | + * | ||
61 | + * @return class name of the consumer in String | ||
62 | + */ | ||
63 | + public String consumerClass() { | ||
64 | + return className; | ||
65 | + } | ||
66 | + | ||
67 | + /** | ||
68 | + * Returns ID value. | ||
69 | + * | ||
70 | + * @return ID value | ||
71 | + */ | ||
72 | + public long value() { | ||
73 | + return value; | ||
74 | + } | ||
75 | + | ||
76 | + @Override | ||
77 | + public boolean equals(Object o) { | ||
78 | + if (this == o) { | ||
79 | + return true; | ||
80 | + } | ||
81 | + if (o == null || getClass() != o.getClass()) { | ||
82 | + return false; | ||
83 | + } | ||
84 | + ResourceConsumerId that = (ResourceConsumerId) o; | ||
85 | + return Objects.equal(className, that.className) && | ||
86 | + Objects.equal(value, that.value); | ||
87 | + } | ||
88 | + | ||
89 | + @Override | ||
90 | + public int hashCode() { | ||
91 | + return Objects.hashCode(className, value); | ||
92 | + } | ||
93 | + | ||
94 | + /** | ||
95 | + * Creates ResourceConsumerId from given value and class. | ||
96 | + * | ||
97 | + * @param value ID value unique within the given class | ||
98 | + * @param cls class of ResourceConsumer implementation | ||
99 | + * @return created ResourceConsumerId object | ||
100 | + */ | ||
101 | + public static <T extends ResourceConsumer> ResourceConsumerId of(long value, Class<T> cls) { | ||
102 | + return new ResourceConsumerId(value, cls); | ||
103 | + } | ||
104 | + | ||
105 | + /** | ||
106 | + * Creates ResourceConsumerId instance from Identifier object. | ||
107 | + * | ||
108 | + * @param id identifier object backed by Long value | ||
109 | + * @return created ResourceConsumerId object | ||
110 | + */ | ||
111 | + public static <T extends Identifier<Long> & ResourceConsumer> ResourceConsumerId of(T id) { | ||
112 | + return new ResourceConsumerId(id.id(), id.getClass()); | ||
113 | + } | ||
114 | +} |
... | @@ -18,6 +18,7 @@ package org.onosproject.net.resource; | ... | @@ -18,6 +18,7 @@ package org.onosproject.net.resource; |
18 | import com.google.common.testing.EqualsTester; | 18 | import com.google.common.testing.EqualsTester; |
19 | import org.junit.Test; | 19 | import org.junit.Test; |
20 | import org.onlab.packet.VlanId; | 20 | import org.onlab.packet.VlanId; |
21 | +import org.onlab.util.Identifier; | ||
21 | import org.onosproject.net.DeviceId; | 22 | import org.onosproject.net.DeviceId; |
22 | import org.onosproject.net.PortNumber; | 23 | import org.onosproject.net.PortNumber; |
23 | import org.onosproject.net.intent.IntentId; | 24 | import org.onosproject.net.intent.IntentId; |
... | @@ -27,18 +28,38 @@ public class ResourceAllocationTest { | ... | @@ -27,18 +28,38 @@ public class ResourceAllocationTest { |
27 | private static final DeviceId D1 = DeviceId.deviceId("of:001"); | 28 | private static final DeviceId D1 = DeviceId.deviceId("of:001"); |
28 | private static final DeviceId D2 = DeviceId.deviceId("of:002"); | 29 | private static final DeviceId D2 = DeviceId.deviceId("of:002"); |
29 | private static final PortNumber P1 = PortNumber.portNumber(1); | 30 | private static final PortNumber P1 = PortNumber.portNumber(1); |
31 | + private static final PortNumber P2 = PortNumber.portNumber(2); | ||
30 | private static final VlanId VLAN1 = VlanId.vlanId((short) 100); | 32 | private static final VlanId VLAN1 = VlanId.vlanId((short) 100); |
31 | - private static final IntentId IID1 = IntentId.valueOf(30); | 33 | + private static final VlanId VLAN2 = VlanId.vlanId((short) 200); |
34 | + private static final TestResourceConsumer RC2 = new TestResourceConsumer(2L); | ||
35 | + | ||
36 | + // ResourceConsumerId generated by specifying ID and class name | ||
37 | + private static final ResourceConsumerId RCID1 = ResourceConsumerId.of(30L, IntentId.class); | ||
38 | + | ||
39 | + // ResourceConsumerId generated from Identifier<Long> class | ||
40 | + private static final ResourceConsumerId RCID2 = ResourceConsumerId.of(RC2); | ||
32 | 41 | ||
33 | @Test | 42 | @Test |
34 | public void testEquals() { | 43 | public void testEquals() { |
35 | - ResourceAllocation alloc1 = new ResourceAllocation(Resources.discrete(D1, P1, VLAN1).resource(), IID1); | 44 | + ResourceAllocation alloc1 = new ResourceAllocation(Resources.discrete(D1, P1, VLAN1).resource(), RCID1); |
36 | - ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resources.discrete(D1, P1, VLAN1).resource(), IID1); | 45 | + ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resources.discrete(D1, P1, VLAN1).resource(), RCID1); |
37 | - ResourceAllocation alloc2 = new ResourceAllocation(Resources.discrete(D2, P1, VLAN1).resource(), IID1); | 46 | + ResourceAllocation alloc2 = new ResourceAllocation(Resources.discrete(D2, P2, VLAN2).resource(), RCID2); |
47 | + ResourceAllocation sameAsAlloc2 = new ResourceAllocation(Resources.discrete(D2, P2, VLAN2).resource(), RCID2); | ||
38 | 48 | ||
39 | new EqualsTester() | 49 | new EqualsTester() |
40 | .addEqualityGroup(alloc1, sameAsAlloc1) | 50 | .addEqualityGroup(alloc1, sameAsAlloc1) |
41 | - .addEqualityGroup(alloc2) | 51 | + .addEqualityGroup(alloc2, sameAsAlloc2) |
42 | .testEquals(); | 52 | .testEquals(); |
43 | } | 53 | } |
54 | + | ||
55 | + private static class TestResourceConsumer extends Identifier<Long> implements ResourceConsumer { | ||
56 | + public TestResourceConsumer(long idValue) { | ||
57 | + super(idValue); | ||
58 | + } | ||
59 | + | ||
60 | + @Override | ||
61 | + public ResourceConsumerId consumerId() { | ||
62 | + return ResourceConsumerId.of(this); | ||
63 | + } | ||
64 | + } | ||
44 | } | 65 | } | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.net.intent.impl; | ||
18 | + | ||
19 | +import com.google.common.annotations.Beta; | ||
20 | +import org.onosproject.net.intent.IntentId; | ||
21 | +import org.onosproject.net.resource.ResourceConsumerId; | ||
22 | + | ||
23 | +import java.util.Optional; | ||
24 | + | ||
25 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
26 | + | ||
27 | +/** | ||
28 | + * Helper class for ResourceService related processes. | ||
29 | + */ | ||
30 | +@Beta | ||
31 | +public final class ResourceHelper { | ||
32 | + | ||
33 | + // To avoid instantiation | ||
34 | + private ResourceHelper() { | ||
35 | + } | ||
36 | + | ||
37 | + /** | ||
38 | + * Creates IntentId object from given consumer ID. | ||
39 | + * | ||
40 | + * @param consumerId ConsumerId object | ||
41 | + * @return Created IntentId object. null if failed to create or given consumer is not instance of IntentId. | ||
42 | + */ | ||
43 | + public static Optional<IntentId> getIntentId(ResourceConsumerId consumerId) { | ||
44 | + checkNotNull(consumerId); | ||
45 | + | ||
46 | + if (!consumerId.isClassOf(IntentId.class)) { | ||
47 | + return Optional.empty(); | ||
48 | + } | ||
49 | + | ||
50 | + return Optional.of(IntentId.valueOf(consumerId.value())); | ||
51 | + } | ||
52 | + | ||
53 | +} |
... | @@ -61,6 +61,7 @@ import org.onosproject.net.intent.impl.IntentCompilationException; | ... | @@ -61,6 +61,7 @@ import org.onosproject.net.intent.impl.IntentCompilationException; |
61 | import org.onosproject.net.optical.OchPort; | 61 | import org.onosproject.net.optical.OchPort; |
62 | import org.onosproject.net.optical.OduCltPort; | 62 | import org.onosproject.net.optical.OduCltPort; |
63 | import org.onosproject.net.intent.IntentSetMultimap; | 63 | import org.onosproject.net.intent.IntentSetMultimap; |
64 | +import org.onosproject.net.intent.impl.ResourceHelper; | ||
64 | import org.onosproject.net.resource.ResourceAllocation; | 65 | import org.onosproject.net.resource.ResourceAllocation; |
65 | import org.onosproject.net.resource.Resource; | 66 | import org.onosproject.net.resource.Resource; |
66 | import org.onosproject.net.resource.ResourceService; | 67 | import org.onosproject.net.resource.ResourceService; |
... | @@ -446,9 +447,9 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu | ... | @@ -446,9 +447,9 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu |
446 | Optional<IntentId> intentId = | 447 | Optional<IntentId> intentId = |
447 | resourceService.getResourceAllocations(Resources.discrete(ochCP.deviceId(), ochCP.port()).id()) | 448 | resourceService.getResourceAllocations(Resources.discrete(ochCP.deviceId(), ochCP.port()).id()) |
448 | .stream() | 449 | .stream() |
449 | - .map(ResourceAllocation::consumer) | 450 | + .map(ResourceAllocation::consumerId) |
450 | - .filter(x -> x instanceof IntentId) | 451 | + .map(ResourceHelper::getIntentId) |
451 | - .map(x -> (IntentId) x) | 452 | + .flatMap(Tools::stream) |
452 | .findAny(); | 453 | .findAny(); |
453 | 454 | ||
454 | if (isAvailable(intentId.orElse(null))) { | 455 | if (isAvailable(intentId.orElse(null))) { |
... | @@ -476,9 +477,9 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu | ... | @@ -476,9 +477,9 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu |
476 | Optional<IntentId> intentId = | 477 | Optional<IntentId> intentId = |
477 | resourceService.getResourceAllocations(Resources.discrete(oduPort.deviceId(), port.number()).id()) | 478 | resourceService.getResourceAllocations(Resources.discrete(oduPort.deviceId(), port.number()).id()) |
478 | .stream() | 479 | .stream() |
479 | - .map(ResourceAllocation::consumer) | 480 | + .map(ResourceAllocation::consumerId) |
480 | - .filter(x -> x instanceof IntentId) | 481 | + .map(ResourceHelper::getIntentId) |
481 | - .map(x -> (IntentId) x) | 482 | + .flatMap(Tools::stream) |
482 | .findAny(); | 483 | .findAny(); |
483 | 484 | ||
484 | if (isAvailable(intentId.orElse(null))) { | 485 | if (isAvailable(intentId.orElse(null))) { | ... | ... |
... | @@ -24,7 +24,7 @@ import org.onosproject.net.resource.ContinuousResourceId; | ... | @@ -24,7 +24,7 @@ import org.onosproject.net.resource.ContinuousResourceId; |
24 | import org.onosproject.net.resource.DiscreteResourceId; | 24 | import org.onosproject.net.resource.DiscreteResourceId; |
25 | import org.onosproject.net.resource.Resource; | 25 | import org.onosproject.net.resource.Resource; |
26 | import org.onosproject.net.resource.ResourceAllocation; | 26 | import org.onosproject.net.resource.ResourceAllocation; |
27 | -import org.onosproject.net.resource.ResourceConsumer; | 27 | +import org.onosproject.net.resource.ResourceConsumerId; |
28 | import org.onosproject.store.service.ConsistentMap; | 28 | import org.onosproject.store.service.ConsistentMap; |
29 | import org.onosproject.store.service.ConsistentMapException; | 29 | import org.onosproject.store.service.ConsistentMapException; |
30 | import org.onosproject.store.service.StorageService; | 30 | import org.onosproject.store.service.StorageService; |
... | @@ -132,10 +132,10 @@ class ConsistentContinuousResourceStore { | ... | @@ -132,10 +132,10 @@ class ConsistentContinuousResourceStore { |
132 | }); | 132 | }); |
133 | } | 133 | } |
134 | 134 | ||
135 | - Stream<ContinuousResource> getResources(ResourceConsumer consumer) { | 135 | + Stream<ContinuousResource> getResources(ResourceConsumerId consumerId) { |
136 | return consumers.values().stream() | 136 | return consumers.values().stream() |
137 | .flatMap(x -> x.value().allocations().stream()) | 137 | .flatMap(x -> x.value().allocations().stream()) |
138 | - .filter(x -> x.consumer().equals(consumer)) | 138 | + .filter(x -> x.consumerId().equals(consumerId)) |
139 | // this cast is safe because this class stores | 139 | // this cast is safe because this class stores |
140 | // continuous resource allocations only | 140 | // continuous resource allocations only |
141 | .map(x -> (ContinuousResource) x.resource()); | 141 | .map(x -> (ContinuousResource) x.resource()); | ... | ... |
... | @@ -22,7 +22,7 @@ import org.onosproject.net.resource.DiscreteResource; | ... | @@ -22,7 +22,7 @@ import org.onosproject.net.resource.DiscreteResource; |
22 | import org.onosproject.net.resource.DiscreteResourceId; | 22 | import org.onosproject.net.resource.DiscreteResourceId; |
23 | import org.onosproject.net.resource.Resource; | 23 | import org.onosproject.net.resource.Resource; |
24 | import org.onosproject.net.resource.ResourceAllocation; | 24 | import org.onosproject.net.resource.ResourceAllocation; |
25 | -import org.onosproject.net.resource.ResourceConsumer; | 25 | +import org.onosproject.net.resource.ResourceConsumerId; |
26 | import org.onosproject.net.resource.Resources; | 26 | import org.onosproject.net.resource.Resources; |
27 | import org.onosproject.store.service.ConsistentMap; | 27 | import org.onosproject.store.service.ConsistentMap; |
28 | import org.onosproject.store.service.ConsistentMapException; | 28 | import org.onosproject.store.service.ConsistentMapException; |
... | @@ -41,11 +41,11 @@ import static org.onosproject.store.resource.impl.ConsistentResourceStore.RETRY_ | ... | @@ -41,11 +41,11 @@ import static org.onosproject.store.resource.impl.ConsistentResourceStore.RETRY_ |
41 | import static org.onosproject.store.resource.impl.ConsistentResourceStore.SERIALIZER; | 41 | import static org.onosproject.store.resource.impl.ConsistentResourceStore.SERIALIZER; |
42 | 42 | ||
43 | class ConsistentDiscreteResourceStore { | 43 | class ConsistentDiscreteResourceStore { |
44 | - private ConsistentMap<DiscreteResourceId, ResourceConsumer> consumers; | 44 | + private ConsistentMap<DiscreteResourceId, ResourceConsumerId> consumers; |
45 | private ConsistentMap<DiscreteResourceId, Set<DiscreteResource>> childMap; | 45 | private ConsistentMap<DiscreteResourceId, Set<DiscreteResource>> childMap; |
46 | 46 | ||
47 | ConsistentDiscreteResourceStore(StorageService service) { | 47 | ConsistentDiscreteResourceStore(StorageService service) { |
48 | - this.consumers = service.<DiscreteResourceId, ResourceConsumer>consistentMapBuilder() | 48 | + this.consumers = service.<DiscreteResourceId, ResourceConsumerId>consistentMapBuilder() |
49 | .withName(MapNames.DISCRETE_CONSUMER_MAP) | 49 | .withName(MapNames.DISCRETE_CONSUMER_MAP) |
50 | .withSerializer(SERIALIZER) | 50 | .withSerializer(SERIALIZER) |
51 | .build(); | 51 | .build(); |
... | @@ -64,12 +64,12 @@ class ConsistentDiscreteResourceStore { | ... | @@ -64,12 +64,12 @@ class ConsistentDiscreteResourceStore { |
64 | 64 | ||
65 | // computational complexity: O(1) | 65 | // computational complexity: O(1) |
66 | List<ResourceAllocation> getResourceAllocations(DiscreteResourceId resource) { | 66 | List<ResourceAllocation> getResourceAllocations(DiscreteResourceId resource) { |
67 | - Versioned<ResourceConsumer> consumer = consumers.get(resource); | 67 | + Versioned<ResourceConsumerId> consumerId = consumers.get(resource); |
68 | - if (consumer == null) { | 68 | + if (consumerId == null) { |
69 | return ImmutableList.of(); | 69 | return ImmutableList.of(); |
70 | } | 70 | } |
71 | 71 | ||
72 | - return ImmutableList.of(new ResourceAllocation(Resources.discrete(resource).resource(), consumer.value())); | 72 | + return ImmutableList.of(new ResourceAllocation(Resources.discrete(resource).resource(), consumerId.value())); |
73 | } | 73 | } |
74 | 74 | ||
75 | Set<DiscreteResource> getChildResources(DiscreteResourceId parent) { | 75 | Set<DiscreteResource> getChildResources(DiscreteResourceId parent) { |
... | @@ -97,9 +97,9 @@ class ConsistentDiscreteResourceStore { | ... | @@ -97,9 +97,9 @@ class ConsistentDiscreteResourceStore { |
97 | .filter(x -> consumers.containsKey(x.id())); | 97 | .filter(x -> consumers.containsKey(x.id())); |
98 | } | 98 | } |
99 | 99 | ||
100 | - Stream<DiscreteResource> getResources(ResourceConsumer consumer) { | 100 | + Stream<DiscreteResource> getResources(ResourceConsumerId consumerId) { |
101 | return consumers.entrySet().stream() | 101 | return consumers.entrySet().stream() |
102 | - .filter(x -> x.getValue().value().equals(consumer)) | 102 | + .filter(x -> x.getValue().value().equals(consumerId)) |
103 | .map(Map.Entry::getKey) | 103 | .map(Map.Entry::getKey) |
104 | .map(x -> Resources.discrete(x).resource()); | 104 | .map(x -> Resources.discrete(x).resource()); |
105 | } | 105 | } | ... | ... |
... | @@ -29,6 +29,7 @@ import org.onosproject.net.resource.DiscreteResourceId; | ... | @@ -29,6 +29,7 @@ import org.onosproject.net.resource.DiscreteResourceId; |
29 | import org.onosproject.net.resource.Resource; | 29 | import org.onosproject.net.resource.Resource; |
30 | import org.onosproject.net.resource.ResourceAllocation; | 30 | import org.onosproject.net.resource.ResourceAllocation; |
31 | import org.onosproject.net.resource.ResourceConsumer; | 31 | import org.onosproject.net.resource.ResourceConsumer; |
32 | +import org.onosproject.net.resource.ResourceConsumerId; | ||
32 | import org.onosproject.net.resource.ResourceEvent; | 33 | import org.onosproject.net.resource.ResourceEvent; |
33 | import org.onosproject.net.resource.ResourceId; | 34 | import org.onosproject.net.resource.ResourceId; |
34 | import org.onosproject.net.resource.ResourceStore; | 35 | import org.onosproject.net.resource.ResourceStore; |
... | @@ -208,11 +209,11 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -208,11 +209,11 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
208 | TransactionalContinuousResourceStore continuousTxStore = continuousStore.transactional(tx); | 209 | TransactionalContinuousResourceStore continuousTxStore = continuousStore.transactional(tx); |
209 | for (Resource resource : resources) { | 210 | for (Resource resource : resources) { |
210 | if (resource instanceof DiscreteResource) { | 211 | if (resource instanceof DiscreteResource) { |
211 | - if (!discreteTxStore.allocate(consumer, (DiscreteResource) resource)) { | 212 | + if (!discreteTxStore.allocate(consumer.consumerId(), (DiscreteResource) resource)) { |
212 | return abortTransaction(tx); | 213 | return abortTransaction(tx); |
213 | } | 214 | } |
214 | } else if (resource instanceof ContinuousResource) { | 215 | } else if (resource instanceof ContinuousResource) { |
215 | - if (!continuousTxStore.allocate(consumer, (ContinuousResource) resource)) { | 216 | + if (!continuousTxStore.allocate(consumer.consumerId(), (ContinuousResource) resource)) { |
216 | return abortTransaction(tx); | 217 | return abortTransaction(tx); |
217 | } | 218 | } |
218 | } | 219 | } |
... | @@ -232,14 +233,14 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -232,14 +233,14 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
232 | TransactionalContinuousResourceStore continuousTxStore = continuousStore.transactional(tx); | 233 | TransactionalContinuousResourceStore continuousTxStore = continuousStore.transactional(tx); |
233 | for (ResourceAllocation allocation : allocations) { | 234 | for (ResourceAllocation allocation : allocations) { |
234 | Resource resource = allocation.resource(); | 235 | Resource resource = allocation.resource(); |
235 | - ResourceConsumer consumer = allocation.consumer(); | 236 | + ResourceConsumerId consumerId = allocation.consumerId(); |
236 | 237 | ||
237 | if (resource instanceof DiscreteResource) { | 238 | if (resource instanceof DiscreteResource) { |
238 | - if (!discreteTxStore.release((DiscreteResource) resource, consumer)) { | 239 | + if (!discreteTxStore.release((DiscreteResource) resource, consumerId)) { |
239 | return abortTransaction(tx); | 240 | return abortTransaction(tx); |
240 | } | 241 | } |
241 | } else if (resource instanceof ContinuousResource) { | 242 | } else if (resource instanceof ContinuousResource) { |
242 | - if (!continuousTxStore.release((ContinuousResource) resource, consumer)) { | 243 | + if (!continuousTxStore.release((ContinuousResource) resource, consumerId)) { |
243 | return abortTransaction(tx); | 244 | return abortTransaction(tx); |
244 | } | 245 | } |
245 | } | 246 | } |
... | @@ -269,11 +270,12 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -269,11 +270,12 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
269 | @Override | 270 | @Override |
270 | public Collection<Resource> getResources(ResourceConsumer consumer) { | 271 | public Collection<Resource> getResources(ResourceConsumer consumer) { |
271 | checkNotNull(consumer); | 272 | checkNotNull(consumer); |
273 | + ResourceConsumerId consumerId = consumer.consumerId(); | ||
272 | 274 | ||
273 | // NOTE: getting all entries may become performance bottleneck | 275 | // NOTE: getting all entries may become performance bottleneck |
274 | // TODO: revisit for better backend data structure | 276 | // TODO: revisit for better backend data structure |
275 | - Stream<DiscreteResource> discrete = discreteStore.getResources(consumer); | 277 | + Stream<DiscreteResource> discrete = discreteStore.getResources(consumer.consumerId()); |
276 | - Stream<ContinuousResource> continuous = continuousStore.getResources(consumer); | 278 | + Stream<ContinuousResource> continuous = continuousStore.getResources(consumer.consumerId()); |
277 | 279 | ||
278 | return Stream.concat(discrete, continuous).collect(Collectors.toList()); | 280 | return Stream.concat(discrete, continuous).collect(Collectors.toList()); |
279 | } | 281 | } | ... | ... |
... | @@ -22,7 +22,7 @@ import org.onosproject.net.resource.ContinuousResource; | ... | @@ -22,7 +22,7 @@ import org.onosproject.net.resource.ContinuousResource; |
22 | import org.onosproject.net.resource.ContinuousResourceId; | 22 | import org.onosproject.net.resource.ContinuousResourceId; |
23 | import org.onosproject.net.resource.DiscreteResourceId; | 23 | import org.onosproject.net.resource.DiscreteResourceId; |
24 | import org.onosproject.net.resource.ResourceAllocation; | 24 | import org.onosproject.net.resource.ResourceAllocation; |
25 | -import org.onosproject.net.resource.ResourceConsumer; | 25 | +import org.onosproject.net.resource.ResourceConsumerId; |
26 | import org.onosproject.store.service.TransactionContext; | 26 | import org.onosproject.store.service.TransactionContext; |
27 | import org.onosproject.store.service.TransactionalMap; | 27 | import org.onosproject.store.service.TransactionalMap; |
28 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
... | @@ -133,7 +133,7 @@ class TransactionalContinuousResourceStore { | ... | @@ -133,7 +133,7 @@ class TransactionalContinuousResourceStore { |
133 | return allocations != null && !allocations.allocations().isEmpty(); | 133 | return allocations != null && !allocations.allocations().isEmpty(); |
134 | } | 134 | } |
135 | 135 | ||
136 | - boolean allocate(ResourceConsumer consumer, ContinuousResource request) { | 136 | + boolean allocate(ResourceConsumerId consumerId, ContinuousResource request) { |
137 | // if the resource is not registered, then abort | 137 | // if the resource is not registered, then abort |
138 | Optional<ContinuousResource> lookedUp = lookup(request.id()); | 138 | Optional<ContinuousResource> lookedUp = lookup(request.id()); |
139 | if (!lookedUp.isPresent()) { | 139 | if (!lookedUp.isPresent()) { |
... | @@ -146,7 +146,7 @@ class TransactionalContinuousResourceStore { | ... | @@ -146,7 +146,7 @@ class TransactionalContinuousResourceStore { |
146 | return false; | 146 | return false; |
147 | } | 147 | } |
148 | 148 | ||
149 | - return appendValue(original, new ResourceAllocation(request, consumer)); | 149 | + return appendValue(original, new ResourceAllocation(request, consumerId)); |
150 | } | 150 | } |
151 | 151 | ||
152 | // Appends the specified ResourceAllocation to the existing values stored in the map | 152 | // Appends the specified ResourceAllocation to the existing values stored in the map |
... | @@ -166,16 +166,16 @@ class TransactionalContinuousResourceStore { | ... | @@ -166,16 +166,16 @@ class TransactionalContinuousResourceStore { |
166 | return consumers.replace(original.id(), oldValue, newValue); | 166 | return consumers.replace(original.id(), oldValue, newValue); |
167 | } | 167 | } |
168 | 168 | ||
169 | - boolean release(ContinuousResource resource, ResourceConsumer consumer) { | 169 | + boolean release(ContinuousResource resource, ResourceConsumerId consumerId) { |
170 | ContinuousResourceAllocation oldAllocation = consumers.get(resource.id()); | 170 | ContinuousResourceAllocation oldAllocation = consumers.get(resource.id()); |
171 | 171 | ||
172 | List<ResourceAllocation> nonMatched = oldAllocation.allocations().stream() | 172 | List<ResourceAllocation> nonMatched = oldAllocation.allocations().stream() |
173 | - .filter(x -> !(x.consumer().equals(consumer) && | 173 | + .filter(x -> !(x.consumerId().equals(consumerId) && |
174 | ((ContinuousResource) x.resource()).value() == resource.value())) | 174 | ((ContinuousResource) x.resource()).value() == resource.value())) |
175 | .collect(Collectors.toList()); | 175 | .collect(Collectors.toList()); |
176 | 176 | ||
177 | List<ResourceAllocation> matched = oldAllocation.allocations().stream() | 177 | List<ResourceAllocation> matched = oldAllocation.allocations().stream() |
178 | - .filter(x -> (x.consumer().equals(consumer) && | 178 | + .filter(x -> (x.consumerId().equals(consumerId) && |
179 | ((ContinuousResource) x.resource()).value() == resource.value())) | 179 | ((ContinuousResource) x.resource()).value() == resource.value())) |
180 | .collect(Collectors.toList()); | 180 | .collect(Collectors.toList()); |
181 | 181 | ... | ... |
... | @@ -19,7 +19,7 @@ import com.google.common.collect.Sets; | ... | @@ -19,7 +19,7 @@ import com.google.common.collect.Sets; |
19 | import org.onosproject.net.resource.DiscreteResource; | 19 | import org.onosproject.net.resource.DiscreteResource; |
20 | import org.onosproject.net.resource.DiscreteResourceId; | 20 | import org.onosproject.net.resource.DiscreteResourceId; |
21 | import org.onosproject.net.resource.Resource; | 21 | import org.onosproject.net.resource.Resource; |
22 | -import org.onosproject.net.resource.ResourceConsumer; | 22 | +import org.onosproject.net.resource.ResourceConsumerId; |
23 | import org.onosproject.net.resource.Resources; | 23 | import org.onosproject.net.resource.Resources; |
24 | import org.onosproject.store.service.TransactionContext; | 24 | import org.onosproject.store.service.TransactionContext; |
25 | import org.onosproject.store.service.TransactionalMap; | 25 | import org.onosproject.store.service.TransactionalMap; |
... | @@ -36,7 +36,7 @@ import static org.onosproject.store.resource.impl.ConsistentResourceStore.SERIAL | ... | @@ -36,7 +36,7 @@ import static org.onosproject.store.resource.impl.ConsistentResourceStore.SERIAL |
36 | class TransactionalDiscreteResourceStore { | 36 | class TransactionalDiscreteResourceStore { |
37 | private final Logger log = LoggerFactory.getLogger(getClass()); | 37 | private final Logger log = LoggerFactory.getLogger(getClass()); |
38 | private final TransactionalMap<DiscreteResourceId, Set<DiscreteResource>> childMap; | 38 | private final TransactionalMap<DiscreteResourceId, Set<DiscreteResource>> childMap; |
39 | - private final TransactionalMap<DiscreteResourceId, ResourceConsumer> consumers; | 39 | + private final TransactionalMap<DiscreteResourceId, ResourceConsumerId> consumers; |
40 | 40 | ||
41 | TransactionalDiscreteResourceStore(TransactionContext tx) { | 41 | TransactionalDiscreteResourceStore(TransactionContext tx) { |
42 | this.childMap = tx.getTransactionalMap(MapNames.DISCRETE_CHILD_MAP, SERIALIZER); | 42 | this.childMap = tx.getTransactionalMap(MapNames.DISCRETE_CHILD_MAP, SERIALIZER); |
... | @@ -121,21 +121,21 @@ class TransactionalDiscreteResourceStore { | ... | @@ -121,21 +121,21 @@ class TransactionalDiscreteResourceStore { |
121 | return consumers.get(id) != null; | 121 | return consumers.get(id) != null; |
122 | } | 122 | } |
123 | 123 | ||
124 | - boolean allocate(ResourceConsumer consumer, DiscreteResource resource) { | 124 | + boolean allocate(ResourceConsumerId consumerId, DiscreteResource resource) { |
125 | // if the resource is not registered, then abort | 125 | // if the resource is not registered, then abort |
126 | Optional<DiscreteResource> lookedUp = lookup(resource.id()); | 126 | Optional<DiscreteResource> lookedUp = lookup(resource.id()); |
127 | if (!lookedUp.isPresent()) { | 127 | if (!lookedUp.isPresent()) { |
128 | return false; | 128 | return false; |
129 | } | 129 | } |
130 | 130 | ||
131 | - ResourceConsumer oldValue = consumers.put(resource.id(), consumer); | 131 | + ResourceConsumerId oldValue = consumers.put(resource.id(), consumerId); |
132 | return oldValue == null; | 132 | return oldValue == null; |
133 | } | 133 | } |
134 | 134 | ||
135 | - boolean release(DiscreteResource resource, ResourceConsumer consumer) { | 135 | + boolean release(DiscreteResource resource, ResourceConsumerId consumerId) { |
136 | // if this single release fails (because the resource is allocated to another consumer) | 136 | // if this single release fails (because the resource is allocated to another consumer) |
137 | // the whole release fails | 137 | // the whole release fails |
138 | - if (!consumers.remove(resource.id(), consumer)) { | 138 | + if (!consumers.remove(resource.id(), consumerId)) { |
139 | return false; | 139 | return false; |
140 | } | 140 | } |
141 | 141 | ... | ... |
... | @@ -199,6 +199,7 @@ import org.onosproject.net.resource.DiscreteResourceSetSerializer; | ... | @@ -199,6 +199,7 @@ import org.onosproject.net.resource.DiscreteResourceSetSerializer; |
199 | import org.onosproject.net.resource.MplsCodec; | 199 | import org.onosproject.net.resource.MplsCodec; |
200 | import org.onosproject.net.resource.NoOpCodec; | 200 | import org.onosproject.net.resource.NoOpCodec; |
201 | import org.onosproject.net.resource.ResourceAllocation; | 201 | import org.onosproject.net.resource.ResourceAllocation; |
202 | +import org.onosproject.net.resource.ResourceConsumerId; | ||
202 | import org.onosproject.net.packet.DefaultOutboundPacket; | 203 | import org.onosproject.net.packet.DefaultOutboundPacket; |
203 | import org.onosproject.net.packet.DefaultPacketRequest; | 204 | import org.onosproject.net.packet.DefaultPacketRequest; |
204 | import org.onosproject.net.packet.PacketPriority; | 205 | import org.onosproject.net.packet.PacketPriority; |
... | @@ -454,6 +455,7 @@ public final class KryoNamespaces { | ... | @@ -454,6 +455,7 @@ public final class KryoNamespaces { |
454 | DiscreteResourceId.class, | 455 | DiscreteResourceId.class, |
455 | ContinuousResourceId.class, | 456 | ContinuousResourceId.class, |
456 | ResourceAllocation.class, | 457 | ResourceAllocation.class, |
458 | + ResourceConsumerId.class, | ||
457 | // Constraints | 459 | // Constraints |
458 | BandwidthConstraint.class, | 460 | BandwidthConstraint.class, |
459 | LinkTypeConstraint.class, | 461 | LinkTypeConstraint.class, | ... | ... |
... | @@ -67,6 +67,7 @@ import org.onosproject.net.resource.DiscreteResource; | ... | @@ -67,6 +67,7 @@ import org.onosproject.net.resource.DiscreteResource; |
67 | import org.onosproject.net.resource.DiscreteResourceSet; | 67 | import org.onosproject.net.resource.DiscreteResourceSet; |
68 | import org.onosproject.net.resource.MplsCodec; | 68 | import org.onosproject.net.resource.MplsCodec; |
69 | import org.onosproject.net.resource.ResourceAllocation; | 69 | import org.onosproject.net.resource.ResourceAllocation; |
70 | +import org.onosproject.net.resource.ResourceConsumerId; | ||
70 | import org.onosproject.net.resource.Resources; | 71 | import org.onosproject.net.resource.Resources; |
71 | import org.onosproject.net.provider.ProviderId; | 72 | import org.onosproject.net.provider.ProviderId; |
72 | import org.onosproject.net.intent.constraint.AnnotationConstraint; | 73 | import org.onosproject.net.intent.constraint.AnnotationConstraint; |
... | @@ -404,7 +405,7 @@ public class KryoSerializerTest { | ... | @@ -404,7 +405,7 @@ public class KryoSerializerTest { |
404 | public void testResourceAllocation() { | 405 | public void testResourceAllocation() { |
405 | testSerializedEquals(new ResourceAllocation( | 406 | testSerializedEquals(new ResourceAllocation( |
406 | Resources.discrete(DID1, P1, VLAN1).resource(), | 407 | Resources.discrete(DID1, P1, VLAN1).resource(), |
407 | - IntentId.valueOf(30))); | 408 | + ResourceConsumerId.of(30L, IntentId.class))); |
408 | } | 409 | } |
409 | 410 | ||
410 | @Test | 411 | @Test | ... | ... |
-
Please register or login to post a comment