Sho SHIMIZU
Committed by Gerrit Code Review

ONOS-3296: Support continuous type resources

Change-Id: I155e41e7a7c1750ff45986a55bedab353485d3fa
...@@ -126,13 +126,13 @@ public interface ResourceService extends ListenerService<ResourceEvent, Resource ...@@ -126,13 +126,13 @@ public interface ResourceService extends ListenerService<ResourceEvent, Resource
126 boolean release(ResourceConsumer consumer); 126 boolean release(ResourceConsumer consumer);
127 127
128 /** 128 /**
129 - * Returns resource allocation of the specified resource. 129 + * Returns resource allocations of the specified resource.
130 * 130 *
131 * @param resource resource to check the allocation 131 * @param resource resource to check the allocation
132 - * @return allocation information enclosed by Optional. 132 + * @return list of allocation information.
133 - * If the resource is not allocated, the return value is empty. 133 + * If the resource is not allocated, the return value is an empty list.
134 */ 134 */
135 - Optional<ResourceAllocation> getResourceAllocation(ResourcePath resource); 135 + List<ResourceAllocation> getResourceAllocation(ResourcePath resource);
136 136
137 /** 137 /**
138 * Returns allocated resources being as children of the specified parent and being the specified resource type. 138 * Returns allocated resources being as children of the specified parent and being the specified resource type.
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -20,7 +20,6 @@ import org.onosproject.store.Store; ...@@ -20,7 +20,6 @@ import org.onosproject.store.Store;
20 20
21 import java.util.Collection; 21 import java.util.Collection;
22 import java.util.List; 22 import java.util.List;
23 -import java.util.Optional;
24 23
25 /** 24 /**
26 * Service for storing resource and consumer information. 25 * Service for storing resource and consumer information.
...@@ -77,12 +76,23 @@ public interface ResourceStore extends Store<ResourceEvent, ResourceStoreDelegat ...@@ -77,12 +76,23 @@ public interface ResourceStore extends Store<ResourceEvent, ResourceStoreDelegat
77 boolean release(List<ResourcePath> resources, List<ResourceConsumer> consumers); 76 boolean release(List<ResourcePath> resources, List<ResourceConsumer> consumers);
78 77
79 /** 78 /**
80 - * Returns the resource consumer to whom the specified resource is allocated. 79 + * Returns the resource consumers to whom the specified resource is allocated.
80 + * The return value is a list having only one element when the given resource is discrete type.
81 + * The return value may have multiple elements when the given resource is continuous type.
81 * 82 *
82 * @param resource resource whose allocated consumer to be returned 83 * @param resource resource whose allocated consumer to be returned
83 - * @return resource consumer who are allocated the resource 84 + * @return resource consumers who are allocated the resource.
85 + * Returns empty list if there is no such consumer.
84 */ 86 */
85 - Optional<ResourceConsumer> getConsumer(ResourcePath resource); 87 + List<ResourceConsumer> getConsumers(ResourcePath resource);
88 +
89 + /**
90 + * Returns the availability of the specified resource.
91 + *
92 + * @param resource resource to check the availability
93 + * @return true if available, otherwise false
94 + */
95 + boolean isAvailable(ResourcePath resource);
86 96
87 /** 97 /**
88 * Returns a collection of the resources allocated to the specified consumer. 98 * Returns a collection of the resources allocated to the specified consumer.
......
...@@ -313,9 +313,11 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -313,9 +313,11 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
313 OchPort ochPort = (OchPort) deviceService.getPort(ochCP.deviceId(), ochCP.port()); 313 OchPort ochPort = (OchPort) deviceService.getPort(ochCP.deviceId(), ochCP.port());
314 Optional<IntentId> intentId = 314 Optional<IntentId> intentId =
315 resourceService.getResourceAllocation(ResourcePath.discrete(ochCP.deviceId(), ochCP.port())) 315 resourceService.getResourceAllocation(ResourcePath.discrete(ochCP.deviceId(), ochCP.port()))
316 + .stream()
316 .map(ResourceAllocation::consumer) 317 .map(ResourceAllocation::consumer)
317 .filter(x -> x instanceof IntentId) 318 .filter(x -> x instanceof IntentId)
318 - .map(x -> (IntentId) x); 319 + .map(x -> (IntentId) x)
320 + .findAny();
319 321
320 if (isAvailable(intentId.orElse(null))) { 322 if (isAvailable(intentId.orElse(null))) {
321 return ochPort; 323 return ochPort;
...@@ -332,9 +334,12 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -332,9 +334,12 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
332 334
333 Optional<IntentId> intentId = 335 Optional<IntentId> intentId =
334 resourceService.getResourceAllocation(ResourcePath.discrete(oduPort.deviceId(), port.number())) 336 resourceService.getResourceAllocation(ResourcePath.discrete(oduPort.deviceId(), port.number()))
337 + .stream()
335 .map(ResourceAllocation::consumer) 338 .map(ResourceAllocation::consumer)
336 .filter(x -> x instanceof IntentId) 339 .filter(x -> x instanceof IntentId)
337 - .map(x -> (IntentId) x); 340 + .map(x -> (IntentId) x)
341 + .findAny();
342 +
338 if (isAvailable(intentId.orElse(null))) { 343 if (isAvailable(intentId.orElse(null))) {
339 return (OchPort) port; 344 return (OchPort) port;
340 } 345 }
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.Deactivate;
23 import org.apache.felix.scr.annotations.Reference; 23 import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.apache.felix.scr.annotations.Service; 25 import org.apache.felix.scr.annotations.Service;
26 +import org.onlab.util.GuavaCollectors;
26 import org.onosproject.event.AbstractListenerManager; 27 import org.onosproject.event.AbstractListenerManager;
27 import org.onosproject.net.newresource.ResourceAdminService; 28 import org.onosproject.net.newresource.ResourceAdminService;
28 import org.onosproject.net.newresource.ResourceAllocation; 29 import org.onosproject.net.newresource.ResourceAllocation;
...@@ -34,10 +35,8 @@ import org.onosproject.net.newresource.ResourcePath; ...@@ -34,10 +35,8 @@ import org.onosproject.net.newresource.ResourcePath;
34 import org.onosproject.net.newresource.ResourceStore; 35 import org.onosproject.net.newresource.ResourceStore;
35 import org.onosproject.net.newresource.ResourceStoreDelegate; 36 import org.onosproject.net.newresource.ResourceStoreDelegate;
36 37
37 -import java.util.ArrayList;
38 import java.util.Collection; 38 import java.util.Collection;
39 import java.util.List; 39 import java.util.List;
40 -import java.util.Optional;
41 import java.util.stream.Collectors; 40 import java.util.stream.Collectors;
42 41
43 import static com.google.common.base.Preconditions.checkNotNull; 42 import static com.google.common.base.Preconditions.checkNotNull;
...@@ -107,11 +106,13 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent ...@@ -107,11 +106,13 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent
107 } 106 }
108 107
109 @Override 108 @Override
110 - public Optional<ResourceAllocation> getResourceAllocation(ResourcePath resource) { 109 + public List<ResourceAllocation> getResourceAllocation(ResourcePath resource) {
111 checkNotNull(resource); 110 checkNotNull(resource);
112 111
113 - Optional<ResourceConsumer> consumer = store.getConsumer(resource); 112 + List<ResourceConsumer> consumers = store.getConsumers(resource);
114 - return consumer.map(x -> new ResourceAllocation(resource, x)); 113 + return consumers.stream()
114 + .map(x -> new ResourceAllocation(resource, x))
115 + .collect(GuavaCollectors.toImmutableList());
115 } 116 }
116 117
117 @Override 118 @Override
...@@ -119,17 +120,12 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent ...@@ -119,17 +120,12 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent
119 checkNotNull(parent); 120 checkNotNull(parent);
120 checkNotNull(cls); 121 checkNotNull(cls);
121 122
123 + // We access store twice in this method, then the store may be updated by others
122 Collection<ResourcePath> resources = store.getAllocatedResources(parent, cls); 124 Collection<ResourcePath> resources = store.getAllocatedResources(parent, cls);
123 - List<ResourceAllocation> allocations = new ArrayList<>(resources.size()); 125 + return resources.stream()
124 - for (ResourcePath resource: resources) { 126 + .flatMap(resource -> store.getConsumers(resource).stream()
125 - // We access store twice in this method, then the store may be updated by others 127 + .map(consumer -> new ResourceAllocation(resource, consumer)))
126 - Optional<ResourceConsumer> consumer = store.getConsumer(resource); 128 + .collect(GuavaCollectors.toImmutableList());
127 - if (consumer.isPresent()) {
128 - allocations.add(new ResourceAllocation(resource, consumer.get()));
129 - }
130 - }
131 -
132 - return allocations;
133 } 129 }
134 130
135 @Override 131 @Override
...@@ -149,7 +145,7 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent ...@@ -149,7 +145,7 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent
149 Collection<ResourcePath> children = store.getChildResources(parent); 145 Collection<ResourcePath> children = store.getChildResources(parent);
150 return children.stream() 146 return children.stream()
151 // We access store twice in this method, then the store may be updated by others 147 // We access store twice in this method, then the store may be updated by others
152 - .filter(x -> !store.getConsumer(x).isPresent()) 148 + .filter(store::isAvailable)
153 .collect(Collectors.toList()); 149 .collect(Collectors.toList());
154 } 150 }
155 151
...@@ -157,8 +153,7 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent ...@@ -157,8 +153,7 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent
157 public boolean isAvailable(ResourcePath resource) { 153 public boolean isAvailable(ResourcePath resource) {
158 checkNotNull(resource); 154 checkNotNull(resource);
159 155
160 - Optional<ResourceConsumer> consumer = store.getConsumer(resource); 156 + return store.isAvailable(resource);
161 - return !consumer.isPresent();
162 } 157 }
163 158
164 @Override 159 @Override
......
...@@ -66,9 +66,10 @@ class MockResourceService implements ResourceService { ...@@ -66,9 +66,10 @@ class MockResourceService implements ResourceService {
66 } 66 }
67 67
68 @Override 68 @Override
69 - public Optional<ResourceAllocation> getResourceAllocation(ResourcePath resource) { 69 + public List<ResourceAllocation> getResourceAllocation(ResourcePath resource) {
70 return Optional.ofNullable(assignment.get(resource)) 70 return Optional.ofNullable(assignment.get(resource))
71 - .map(x -> new ResourceAllocation(resource, x)); 71 + .map(x -> ImmutableList.of(new ResourceAllocation(resource, x)))
72 + .orElse(ImmutableList.of());
72 } 73 }
73 74
74 @Override 75 @Override
......
...@@ -204,6 +204,7 @@ import java.util.Arrays; ...@@ -204,6 +204,7 @@ import java.util.Arrays;
204 import java.util.Collections; 204 import java.util.Collections;
205 import java.util.HashMap; 205 import java.util.HashMap;
206 import java.util.HashSet; 206 import java.util.HashSet;
207 +import java.util.LinkedHashSet;
207 import java.util.LinkedList; 208 import java.util.LinkedList;
208 import java.util.Optional; 209 import java.util.Optional;
209 import java.util.concurrent.ConcurrentHashMap; 210 import java.util.concurrent.ConcurrentHashMap;
...@@ -239,7 +240,8 @@ public final class KryoNamespaces { ...@@ -239,7 +240,8 @@ public final class KryoNamespaces {
239 .register(CopyOnWriteArraySet.class) 240 .register(CopyOnWriteArraySet.class)
240 .register(ArrayList.class, 241 .register(ArrayList.class,
241 LinkedList.class, 242 LinkedList.class,
242 - HashSet.class 243 + HashSet.class,
244 + LinkedHashSet.class
243 ) 245 )
244 .register(Maps.immutableEntry("a", "b").getClass()) 246 .register(Maps.immutableEntry("a", "b").getClass())
245 .register(new ArraysAsListSerializer(), Arrays.asList().getClass()) 247 .register(new ArraysAsListSerializer(), Arrays.asList().getClass())
......