ONOS-2446: Implement API to declare resource hierarchy
Remove API to define resource boundary
(ResourceAdminService.defineResourceBoundary) to integrate with API for
resource hierarchy
Change-Id: Iffa28dec16320122fe41f4f455000596fa266acb
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java
index 5fcb132..1a13c32 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java
@@ -17,7 +17,8 @@
import com.google.common.annotations.Beta;
-import java.util.function.Predicate;
+import java.util.Arrays;
+import java.util.List;
/**
* Service for administering resource service behavior.
@@ -25,13 +26,26 @@
@Beta
public interface ResourceAdminService {
/**
- * Define a boundary of the resource specified by the class.
- * The specified predicate is expected to return true if the supplied value is
- * in the resource boundary and return false if it is out of the boundary.
+ * Register resources as the children of the parent resource path.
*
- * @param cls class of the resource type
- * @param predicate predicate returning true if the value is in the boundary
- * @param <T> type of the resource
+ * @param parent parent resource path under which the resource are registered
+ * @param children resources to be registered as the children of the parent
+ * @param <T> type of resources
+ * @return true if registration is successfully done, false otherwise. Registration
+ * succeeds when each resource is not registered or unallocated.
*/
- <T> void defineResourceBoundary(Class<T> cls, Predicate<T> predicate);
+ default <T> boolean registerResources(ResourcePath parent, T... children) {
+ return registerResources(parent, Arrays.asList(children));
+ }
+
+ /**
+ * Register resources as the children of the parent resource path.
+ *
+ * @param parent parent resource path under which the resource are registered
+ * @param children resources to be registered as the children of the parent
+ * @param <T> type of resources
+ * @return true if registration is successfully done, false otherwise. Registration
+ * succeeds when each resource is not registered or unallocated.
+ */
+ <T> boolean registerResources(ResourcePath parent, List<T> children);
}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
index 6a7ab94..7c78a9a 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
@@ -24,7 +24,6 @@
import java.util.Objects;
import java.util.Optional;
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
@@ -42,6 +41,16 @@
private final List<Object> resources;
+ public static final ResourcePath ROOT = new ResourcePath(ImmutableList.of());
+
+ public static ResourcePath child(ResourcePath parent, Object child) {
+ ImmutableList<Object> components = ImmutableList.builder()
+ .addAll(parent.components())
+ .add(child)
+ .build();
+ return new ResourcePath(components);
+ }
+
/**
* Creates an resource path from the specified components.
*
@@ -58,7 +67,6 @@
*/
public ResourcePath(List<Object> components) {
checkNotNull(components);
- checkArgument(components.size() > 0);
this.resources = ImmutableList.copyOf(components);
}
@@ -85,7 +93,7 @@
* If there is no parent, empty instance will be returned.
*/
public Optional<ResourcePath> parent() {
- if (resources.size() >= 2) {
+ if (resources.size() > 0) {
return Optional.of(new ResourcePath(resources.subList(0, resources.size() - 1)));
}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
index 7280b60..b711f39 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
@@ -11,6 +11,19 @@
*/
@Beta
public interface ResourceStore {
+
+ /**
+ * Registers the resources as children of the parent resource in transactional way.
+ * Resource registration is must be done before resource allocation. The state after completion
+ * of this method is all the resources are registered, or no resource is registered.
+ * The whole registration fails when any one of the resource can't be registered.
+ *
+ * @param parent resource which is the parent of the resource to be registered
+ * @param children resources to be registered
+ * @return true if the registration succeeds, false otherwise
+ */
+ boolean register(ResourcePath parent, List<ResourcePath> children);
+
/**
* Allocates the specified resources to the specified consumer in transactional way.
* The state after completion of this method is all the resources are allocated to the consumer,
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
index 3034048..4a8886a 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
@@ -49,9 +49,11 @@
.testEquals();
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
public void testCreateWithZeroComponent() {
ResourcePath path = new ResourcePath();
+
+ assertThat(path, is(ResourcePath.ROOT));
}
@Test
@@ -66,7 +68,7 @@
public void testNoParent() {
ResourcePath path = new ResourcePath(LinkKey.linkKey(CP1_1, CP2_1));
- assertThat(path.parent(), is(Optional.empty()));
+ assertThat(path.parent(), is(Optional.of(ResourcePath.ROOT)));
}
@Test