Henry Yu
Committed by Brian O'Connor

RESTCONF Server outline

Change-Id: Id93a647b35b24c47f2828763a799b56a50113faf
Showing 22 changed files with 1021 additions and 0 deletions
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
42 <module>snmp</module> 42 <module>snmp</module>
43 <module>bmv2</module> 43 <module>bmv2</module>
44 <module>lisp</module> 44 <module>lisp</module>
45 + <module>restconf</module>
45 </modules> 46 </modules>
46 47
47 <dependencies> 48 <dependencies>
......
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +
18 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
19 + <modelVersion>4.0.0</modelVersion>
20 + <parent>
21 + <groupId>org.onosproject</groupId>
22 + <artifactId>onos-protocols</artifactId>
23 + <version>1.8.0-SNAPSHOT</version>
24 + </parent>
25 +
26 + <artifactId>onos-restconf</artifactId>
27 + <packaging>pom</packaging>
28 +
29 + <modules>
30 + <module>server</module>
31 + </modules>
32 +
33 +</project>
1 +BUNDLES = [
2 + '//protocols/restconf/server/api:onos-protocols-restconf-server-api',
3 + '//protocols/restconf/server/restconfmgr:onos-protocols-restconf-server-restconfmgr',
4 + '//protocols/restconf/server/rpp:onos-protocols-restconf-server-rpp',
5 +]
6 +
7 +onos_app (
8 + title = 'RESTCONF Server Module',
9 + category = 'Utility',
10 + url = 'http://onosproject.org',
11 + included_bundles = BUNDLES,
12 +)
1 +COMPILE_DEPS = [
2 + '//lib:CORE_DEPS',
3 + '//lib:jersey-client',
4 + '//lib:javax.ws.rs-api',
5 + '//lib:jersey-server',
6 +]
7 +
8 +osgi_jar_with_tests (
9 + deps = COMPILE_DEPS,
10 +)
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<project xmlns="http://maven.apache.org/POM/4.0.0"
18 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
20 + <modelVersion>4.0.0</modelVersion>
21 +
22 + <parent>
23 + <groupId>org.onosproject</groupId>
24 + <artifactId>onos-restconf-server</artifactId>
25 + <version>1.8.0-SNAPSHOT</version>
26 + <relativePath>../pom.xml</relativePath>
27 + </parent>
28 +
29 + <artifactId>onos-restconf-server-api</artifactId>
30 + <packaging>bundle</packaging>
31 +
32 + <dependencies>
33 + <dependency>
34 + <groupId>org.osgi</groupId>
35 + <artifactId>org.osgi.compendium</artifactId>
36 + </dependency>
37 + <dependency>
38 + <groupId>org.onosproject</groupId>
39 + <artifactId>onos-api</artifactId>
40 + </dependency>
41 + <dependency>
42 + <groupId>org.onosproject</groupId>
43 + <artifactId>onos-core-serializers</artifactId>
44 + <version>${project.version}</version>
45 + </dependency>
46 + <dependency>
47 + <groupId>org.glassfish.jersey.containers</groupId>
48 + <artifactId>jersey-container-servlet</artifactId>
49 + </dependency>
50 + </dependencies>
51 +
52 +</project>
53 +
1 +/*
2 + * Copyright 2016-present 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 +package org.onosproject.protocol.restconf.server.api;
17 +
18 +import javax.ws.rs.WebApplicationException;
19 +import javax.ws.rs.core.Response;
20 +
21 +import static javax.ws.rs.core.Response.Status;
22 +
23 +/**
24 + * Exceptions raised during RESTCONF operations. This class extends
25 + * WebApplicationException. The design intention is to create a place holder
26 + * for RESTCONF specific errors and to be able to add more functions as the
27 + * subsystem grows.
28 + */
29 +public class RestconfException extends WebApplicationException {
30 +
31 + // This is a randomly generated value. A WebApplicationException class is required to define it.
32 + private static final long SERIAL_VERSION_UID = 3275970397584007046L;
33 +
34 + /**
35 + * Constructs a new RESTCONF server error exception. The caller raising this
36 + * exception may pass in a HTTP error status code and an error message. The
37 + * error code will be displayed to the RESTCONF client as part of the
38 + * response from the RESTCONF server. The error message is a string which
39 + * may be saved in a log file and may be later retrieved by the
40 + * getMessage() method.
41 + *
42 + * @param message the detailed error message
43 + * @param status HTTP error status
44 + * @throws IllegalArgumentException in case the status code is null or is not from
45 + * javax.ws.rs.core.Response.Status.Family
46 + * status code family
47 + */
48 + public RestconfException(String message, Status status) {
49 + super(message, null, Response.status(status).build());
50 + }
51 +
52 + /**
53 + * Constructs a new RESTCONF server error exception. The caller raising
54 + * this exception may pass in the numerical value of a HTTP error
55 + * status code, The error code will be displayed to the RESTCONF client
56 + * as a response from the RESTCONF server.
57 + *
58 + * @param status HTTP error status
59 + * @throws IllegalArgumentException in case the status code is not a valid
60 + * HTTP status code or if it is not from the
61 + * javax.ws.rs.core.Response.Status.Family
62 + * status code family
63 + */
64 + public RestconfException(int status) {
65 + super((Throwable) null, Response.status(status).build());
66 + }
67 +}
1 +/*
2 + * Copyright 2016-present 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 +package org.onosproject.protocol.restconf.server.api;
17 +
18 +import com.fasterxml.jackson.databind.node.ObjectNode;
19 +import org.glassfish.jersey.server.ChunkedOutput;
20 +
21 +/**
22 + * Abstraction of RESTCONF Server functionality according to the
23 + * RESTCONF RFC (no official RFC number yet).
24 + */
25 +public interface RestconfService {
26 + /**
27 + * Processes a GET request against a data resource. The
28 + * target data resource is identified by its URI.
29 + *
30 + * @param uri URI of the target data resource
31 + * @return JSON representation of the data resource
32 + * @throws RestconfException if the GET operation cannot be fulfilled due
33 + * reasons such as the nonexistence of the target
34 + * resource. The proper HTTP error status code is
35 + * enclosed in the exception, so that the caller
36 + * may return it to the RESTCONF client
37 + */
38 + ObjectNode runGetOperationOnDataResource(String uri) throws RestconfException;
39 +
40 + /**
41 + * Processes a POST request against a data resource. The location of
42 + * the target resource is passed in as a URI. And the resource's
43 + * content is passed in as a JSON ObjectNode.
44 + *
45 + * @param uri URI of the data resource to be created
46 + * @param rootNode JSON representation of the data resource
47 + * @throws RestconfException if the POST operation cannot be fulfilled due
48 + * reasons such as wrong URI or syntax error
49 + * in JSON payload. The proper HTTP error status
50 + * code is enclosed in the exception
51 + */
52 + void runPostOperationOnDataResource(String uri, ObjectNode rootNode) throws RestconfException;
53 +
54 + /**
55 + * Processes a PUT request against a data resource. The location of
56 + * the target resource is passed in as a URI. And the resource's
57 + * content is passed in as a JSON ObjectNode.
58 + *
59 + * @param uri URI of the data resource to be created or updated
60 + * @param rootNode JSON representation of the data resource
61 + * @throws RestconfException if the PUT operation cannot be fulfilled due
62 + * reasons such as wrong URI or syntax error
63 + * in JSON payload. The proper HTTP error status
64 + * code is enclosed in the exception
65 + */
66 + void runPutOperationOnDataResource(String uri, ObjectNode rootNode) throws RestconfException;
67 +
68 + /**
69 + * Processes the DELETE operation against a data resource. The target
70 + * data resource is identified by its URI.
71 + *
72 + * @param uri URI of the data resource to be deleted
73 + * @throws RestconfException if the DELETE operation cannot be fulfilled due
74 + * reasons such as the nonexistence of the target
75 + * resource. The proper HTTP error status code is
76 + * enclosed in the exception
77 + */
78 + void runDeleteOperationOnDataResource(String uri) throws RestconfException;
79 +
80 + /**
81 + * Retrieves the RESTCONF Root directory.
82 + *
83 + * @return the RESTCONF Root directory
84 + */
85 + String getRestconfRootPath();
86 +
87 + /**
88 + * Handles an Event Stream subscription request. This function creates
89 + * a worker thread to listen to events and writes to a ChunkedOutput,
90 + * which is passed in from the caller. (The worker thread blocks if
91 + * no events arrive.) The ChuckedOutput is a pipe to which this
92 + * function acts as the writer and the caller the reader.
93 + *
94 + * @param streamId ID of the RESTCONF stream to subscribe
95 + * @param output A string data stream
96 + * @throws RestconfException if the Event Stream cannot be subscribed due to
97 + * reasons such as the nonexistence of the target
98 + * stream or unable to allocate any free worker
99 + * thread to handle the request
100 + */
101 + void subscribeEventStream(String streamId, ChunkedOutput<String> output) throws RestconfException;
102 +}
1 +/*
2 + * Copyright 2016-present 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 +/**
18 + * RESTCONF Server Public Interface. All public interfaces/APIs that might be used by
19 + * external applications should be packaged here.
20 + */
21 +package org.onosproject.protocol.restconf.server.api;
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<app name="org.onosproject.protocols.restconfserver" origin="ON.Lab" version="${project.version}"
18 + category="Utility" url="http://onosproject.org" title="RESTCONF Service Module App"
19 + featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
20 + features="${project.artifactId}" >
21 + <description>${project.description}</description>
22 + <artifact>mvn:${project.groupId}/onos-restconf-server-api/${project.version}</artifact>
23 + <artifact>mvn:${project.groupId}/onos-restconf-server-restconfmanager/${project.version}</artifact>
24 + <artifact>mvn:${project.groupId}/onos-restconf-server-rpp/${project.version}</artifact>
25 +</app>
1 +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
18 + <feature name="${project.artifactId}" version="${project.version}"
19 + description="${project.description}">
20 + <feature>onos-api</feature>
21 + <bundle>mvn:${project.groupId}/onos-restconf-server-api/${project.version}</bundle>
22 + <bundle>mvn:${project.groupId}/onos-restconf-server-restconfmanager/${project.version}</bundle>
23 + <bundle>mvn:${project.groupId}/onos-restconf-server-rpp/${project.version}</bundle>
24 + </feature>
25 +</features>
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<project xmlns="http://maven.apache.org/POM/4.0.0"
18 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
20 + <modelVersion>4.0.0</modelVersion>
21 +
22 + <parent>
23 + <groupId>org.onosproject</groupId>
24 + <artifactId>onos-restconf-server</artifactId>
25 + <version>1.8.0-SNAPSHOT</version>
26 + <relativePath>../pom.xml</relativePath>
27 + </parent>
28 +
29 + <artifactId>onos-restconf-server-app</artifactId>
30 + <packaging>pom</packaging>
31 +
32 + <properties>
33 + <onos.app.readme>RESTCONF Server Module main Application.</onos.app.readme>
34 + </properties>
35 +
36 + <description>RESTCONF Service Module main Application</description>
37 +
38 + <dependencies>
39 + <dependency>
40 + <groupId>org.onosproject</groupId>
41 + <artifactId>onos-restconf-server-api</artifactId>
42 + <version>${project.version}</version>
43 + </dependency>
44 + <dependency>
45 + <groupId>org.onosproject</groupId>
46 + <artifactId>onos-restconf-server-restconfmanager</artifactId>
47 + <version>${project.version}</version>
48 + </dependency>
49 + <dependency>
50 + <groupId>org.onosproject</groupId>
51 + <artifactId>onos-restconf-server-rpp</artifactId>
52 + <version>${project.version}</version>
53 + </dependency>
54 + </dependencies>
55 +</project>
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<project xmlns="http://maven.apache.org/POM/4.0.0"
18 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
20 + <modelVersion>4.0.0</modelVersion>
21 +
22 + <parent>
23 + <groupId>org.onosproject</groupId>
24 + <artifactId>onos-restconf</artifactId>
25 + <version>1.8.0-SNAPSHOT</version>
26 + <relativePath>../pom.xml</relativePath>
27 + </parent>
28 +
29 + <artifactId>onos-restconf-server</artifactId>
30 + <packaging>pom</packaging>
31 +
32 + <modules>
33 + <module>api</module>
34 + <module>restconfmgr</module>
35 + <module>rpp</module>
36 + <module>app</module>
37 + </modules>
38 +
39 + <description>RESTCONF Server Module</description>
40 +</project>
1 +COMPILE_DEPS = [
2 + '//lib:CORE_DEPS',
3 + '//lib:jersey-client',
4 + '//lib:jersey-server',
5 + '//lib:javax.ws.rs-api',
6 + '//utils/rest:onlab-rest',
7 + '//core/store/serializers:onos-core-serializers',
8 + '//protocols/restconf/server/api:onos-protocols-restconf-server-api',
9 +]
10 +
11 +osgi_jar_with_tests (
12 + deps = COMPILE_DEPS,
13 +)
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<project xmlns="http://maven.apache.org/POM/4.0.0"
18 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
20 + <modelVersion>4.0.0</modelVersion>
21 +
22 + <parent>
23 + <groupId>org.onosproject</groupId>
24 + <artifactId>onos-restconf-server</artifactId>
25 + <version>1.8.0-SNAPSHOT</version>
26 + <relativePath>../pom.xml</relativePath>
27 + </parent>
28 +
29 + <artifactId>onos-restconf-server-restconfmanager</artifactId>
30 + <packaging>bundle</packaging>
31 +
32 + <dependencies>
33 + <dependency>
34 + <groupId>org.onosproject</groupId>
35 + <artifactId>onos-restconf-server-api</artifactId>
36 + <version>${project.version}</version>
37 + </dependency>
38 + <dependency>
39 + <groupId>org.onosproject</groupId>
40 + <artifactId>onos-rest</artifactId>
41 + <version>${project.version}</version>
42 + </dependency>
43 + <dependency>
44 + <groupId>org.onosproject</groupId>
45 + <artifactId>onlab-rest</artifactId>
46 + <version>${project.version}</version>
47 + </dependency>
48 + <dependency>
49 + <groupId>org.onosproject</groupId>
50 + <artifactId>onlab-misc</artifactId>
51 + <version>${project.version}</version>
52 + </dependency>
53 + <dependency>
54 + <groupId>org.glassfish.jersey.containers</groupId>
55 + <artifactId>jersey-container-servlet</artifactId>
56 + </dependency>
57 + <dependency>
58 + <groupId>org.apache.felix</groupId>
59 + <artifactId>org.apache.felix.scr.annotations</artifactId>
60 + </dependency>
61 + </dependencies>
62 + <build>
63 + <plugins>
64 + <plugin>
65 + <groupId>org.apache.felix</groupId>
66 + <artifactId>maven-scr-plugin</artifactId>
67 + </plugin>
68 + </plugins>
69 + </build>
70 +</project>
1 +/*
2 + * Copyright 2016-present 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 +/**
18 + * RESTCONF Service Manager implementation.
19 + */
20 +package org.onosproject.protocol.restconf.server.restconfmanager;
1 +COMPILE_DEPS = [
2 + '//lib:CORE_DEPS',
3 + '//lib:jersey-client',
4 + '//lib:jersey-server',
5 + '//lib:javax.ws.rs-api',
6 + '//utils/rest:onlab-rest',
7 + '//protocols/restconf/server/api:onos-protocols-restconf-server-api',
8 + '//protocols/restconf/server/restconfmgr:onos-protocols-restconf-server-restconfmgr',
9 +]
10 +
11 +osgi_jar_with_tests (
12 + deps = COMPILE_DEPS,
13 +)
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<project xmlns="http://maven.apache.org/POM/4.0.0"
18 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
20 + <modelVersion>4.0.0</modelVersion>
21 +
22 + <parent>
23 + <groupId>org.onosproject</groupId>
24 + <artifactId>onos-restconf-server</artifactId>
25 + <version>1.8.0-SNAPSHOT</version>
26 + <relativePath>../pom.xml</relativePath>
27 + </parent>
28 +
29 + <artifactId>onos-restconf-server-rpp</artifactId>
30 + <packaging>bundle</packaging>
31 +
32 + <properties>
33 + <web.context>/onos/restconf</web.context>
34 + <api.version>1.0.0</api.version>
35 + <api.title>YANG RESTCONF Protocol Stack</api.title>
36 + <api.description>
37 + RESTCONF Protocol Proxy
38 + </api.description>
39 + <api.package>org.onosproject.protocol.restconf.server.rpp</api.package>
40 + </properties>
41 +
42 + <dependencies>
43 + <dependency>
44 + <groupId>org.onosproject</groupId>
45 + <artifactId>onos-restconf-server-api</artifactId>
46 + <version>${project.version}</version>
47 + </dependency>
48 + <dependency>
49 + <groupId>org.onosproject</groupId>
50 + <artifactId>onos-restconf-server-restconfmanager</artifactId>
51 + <version>${project.version}</version>
52 + </dependency>
53 + <dependency>
54 + <groupId>org.onosproject</groupId>
55 + <artifactId>onos-rest</artifactId>
56 + <version>${project.version}</version>
57 + </dependency>
58 + <dependency>
59 + <groupId>org.onosproject</groupId>
60 + <artifactId>onlab-rest</artifactId>
61 + <version>${project.version}</version>
62 + </dependency>
63 + <dependency>
64 + <groupId>javax.ws.rs</groupId>
65 + <artifactId>javax.ws.rs-api</artifactId>
66 + <version>2.0.1</version>
67 + </dependency>
68 + <dependency>
69 + <groupId>org.glassfish.jersey.containers</groupId>
70 + <artifactId>jersey-container-servlet</artifactId>
71 + </dependency>
72 + <dependency>
73 + <groupId>com.fasterxml.jackson.core</groupId>
74 + <artifactId>jackson-databind</artifactId>
75 + </dependency>
76 + <dependency>
77 + <groupId>com.fasterxml.jackson.core</groupId>
78 + <artifactId>jackson-annotations</artifactId>
79 + </dependency>
80 + <dependency>
81 + <groupId>org.osgi</groupId>
82 + <artifactId>org.osgi.compendium</artifactId>
83 + </dependency>
84 + <dependency>
85 + <groupId>org.osgi</groupId>
86 + <artifactId>org.osgi.core</artifactId>
87 + </dependency>
88 + <dependency>
89 + <groupId>org.onosproject</groupId>
90 + <artifactId>onos-app-dhcp-api</artifactId>
91 + <version>${project.version}</version>
92 + </dependency>
93 + <dependency>
94 + <groupId>org.glassfish.jersey.core</groupId>
95 + <artifactId>jersey-client</artifactId>
96 + <version>2.22.2</version>
97 + </dependency>
98 + <dependency>
99 + <groupId>org.glassfish.jersey.core</groupId>
100 + <artifactId>jersey-common</artifactId>
101 + <version>2.22.2</version>
102 + </dependency>
103 + <dependency>
104 + <groupId>org.onosproject</groupId>
105 + <artifactId>onlab-misc</artifactId>
106 + <version>${project.version}</version>
107 + </dependency>
108 + <dependency>
109 + <groupId>org.apache.felix</groupId>
110 + <artifactId>org.apache.felix.scr.annotations</artifactId>
111 + <version>1.9.8</version>
112 + </dependency>
113 + <dependency>
114 + <groupId>javax.servlet</groupId>
115 + <artifactId>servlet-api</artifactId>
116 + <version>2.5</version>
117 + </dependency>
118 + </dependencies>
119 +
120 + <build>
121 + <plugins>
122 + <plugin>
123 + <groupId>org.apache.felix</groupId>
124 + <artifactId>maven-bundle-plugin</artifactId>
125 + <extensions>true</extensions>
126 + <configuration>
127 + <instructions>
128 + <_wab>src/main/webapp/</_wab>
129 + <Include-Resource>
130 + WEB-INF/classes/apidoc/swagger.json=target/swagger.json,
131 + {maven-resources}
132 + </Include-Resource>
133 + <Bundle-SymbolicName>
134 + ${project.groupId}.${project.artifactId}
135 + </Bundle-SymbolicName>
136 + <Import-Package>
137 + *,org.glassfish.jersey.servlet
138 + </Import-Package>
139 + <Web-ContextPath>${web.context}</Web-ContextPath>
140 + </instructions>
141 + </configuration>
142 + </plugin>
143 + </plugins>
144 + </build>
145 +
146 +
147 +</project>
1 +/*
2 + * Copyright 2016-present 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 +package org.onosproject.protocol.restconf.server.rpp;
17 +
18 +import org.onlab.rest.AbstractWebApplication;
19 +
20 +import java.util.Set;
21 +
22 +/**
23 + * RESTCONF Server front-end application.
24 + */
25 +public class RestconfProtocolProxy extends AbstractWebApplication {
26 +
27 + @Override
28 + public Set<Class<?>> getClasses() {
29 + return getClasses(RestconfWebResource.class);
30 + }
31 +}
1 +/*
2 + * Copyright 2016-present 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.protocol.restconf.server.rpp;
18 +
19 +import com.fasterxml.jackson.core.JsonProcessingException;
20 +import com.fasterxml.jackson.databind.node.ObjectNode;
21 +import org.glassfish.jersey.server.ChunkedOutput;
22 +import org.onosproject.protocol.restconf.server.api.RestconfException;
23 +import org.onosproject.protocol.restconf.server.api.RestconfService;
24 +import org.onosproject.rest.AbstractWebResource;
25 +import org.slf4j.Logger;
26 +
27 +import javax.ws.rs.Consumes;
28 +import javax.ws.rs.DELETE;
29 +import javax.ws.rs.GET;
30 +import javax.ws.rs.POST;
31 +import javax.ws.rs.PUT;
32 +import javax.ws.rs.Path;
33 +import javax.ws.rs.PathParam;
34 +import javax.ws.rs.Produces;
35 +import javax.ws.rs.core.Context;
36 +import javax.ws.rs.core.MediaType;
37 +import javax.ws.rs.core.Response;
38 +import javax.ws.rs.core.UriInfo;
39 +import java.io.IOException;
40 +import java.io.InputStream;
41 +
42 +import static org.slf4j.LoggerFactory.getLogger;
43 +
44 +/*
45 + * This class is the main implementation of the RESTCONF Protocol
46 + * Proxy module. Currently it only handles some basic operations
47 + * on data resource nodes. However, the design intention is to
48 + * create a code structure that allows new methods/functionality
49 + * to be easily added in future releases.
50 + */
51 +
52 +/**
53 + * Implementation of the RESTCONF Protocol Proxy module.
54 + */
55 +@Path("/")
56 +public class RestconfWebResource extends AbstractWebResource {
57 +
58 + @Context
59 + UriInfo uriInfo;
60 +
61 + private final RestconfService service = get(RestconfService.class);
62 + private final Logger log = getLogger(getClass());
63 +
64 + /**
65 + * Handles a RESTCONF GET operation against a target data resource. If the
66 + * operation is successful, the JSON presentation of the resource plus HTTP
67 + * status code "200 OK" is returned. Otherwise, HTTP error status code
68 + * "400 Bad Request" is returned.
69 + *
70 + * @param uriString URI of the data resource.
71 + * @return HTTP response
72 + */
73 + @GET
74 + @Produces(MediaType.APPLICATION_JSON)
75 + @Path("data/{identifier : .+}")
76 + public Response handleGetRequest(@PathParam("identifier") String uriString) {
77 +
78 + log.debug("handleGetRequest: {}", uriString);
79 +
80 + try {
81 + ObjectNode node = service.runGetOperationOnDataResource(uriString);
82 + return ok(node).build();
83 + } catch (RestconfException e) {
84 + log.error("ERROR: handleGetRequest: {}", e.getMessage());
85 + log.debug("Exception in handleGetRequest:", e);
86 + return e.getResponse();
87 + }
88 + }
89 +
90 + /**
91 + * Handles the RESTCONF Event Notification Subscription request. If the
92 + * subscription is successful, a ChunkedOutput stream is created and returned
93 + * to the caller.
94 + * <P></P>
95 + * This function is not blocked on streaming the data (so that it can handle
96 + * other incoming requests). Instead, a worker thread running in the background
97 + * does the data streaming. If errors occur during streaming, the worker thread
98 + * calls ChunkedOutput.close() to disconnect the session and terminates itself.
99 + *
100 + * @param streamId Event stream ID
101 + * @return A string data stream over HTTP keep-alive session
102 + */
103 + @GET
104 + @Produces(MediaType.APPLICATION_JSON)
105 + @Path("streams/{streamId}")
106 + public ChunkedOutput<String> handleNotificationRegistration(@PathParam("streamId") String streamId) {
107 + final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);
108 + try {
109 + service.subscribeEventStream(streamId, output);
110 + } catch (RestconfException e) {
111 + log.error("ERROR: handleNotificationRegistration: {}", e.getMessage());
112 + log.debug("Exception in handleNotificationRegistration:", e);
113 + try {
114 + output.close();
115 + } catch (IOException ex) {
116 + log.error("ERROR: handleNotificationRegistration:", ex);
117 + }
118 + }
119 +
120 + return output;
121 + }
122 +
123 + /**
124 + * Handles a RESTCONF POST operation against a data resource. If the
125 + * operation is successful, HTTP status code "201 Created" is returned
126 + * and there is no response message-body. If the data resource already
127 + * exists, then the HTTP status code "409 Conflict" is returned.
128 + *
129 + * @param uriString URI of the data resource
130 + * @param stream Input JSON object
131 + * @return HTTP response
132 + */
133 + @POST
134 + @Consumes(MediaType.APPLICATION_JSON)
135 + @Produces(MediaType.APPLICATION_JSON)
136 + @Path("data/{identifier : .+}")
137 + public Response handlePostRequest(@PathParam("identifier") String uriString, InputStream stream) {
138 +
139 + log.debug("handlePostRequest: {}", uriString);
140 +
141 + try {
142 + ObjectNode rootNode = (ObjectNode) mapper().readTree(stream);
143 +
144 + service.runPostOperationOnDataResource(uriString, rootNode);
145 + return Response.created(uriInfo.getRequestUri()).build();
146 + } catch (JsonProcessingException e) {
147 + log.error("ERROR: handlePostRequest ", e);
148 + return Response.status(Response.Status.BAD_REQUEST).build();
149 + } catch (RestconfException e) {
150 + log.error("ERROR: handlePostRequest: {}", e.getMessage());
151 + log.debug("Exception in handlePostRequest:", e);
152 + return e.getResponse();
153 + } catch (IOException ex) {
154 + log.error("ERROR: handlePostRequest ", ex);
155 + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
156 + }
157 + }
158 +
159 + /**
160 + * Handles a RESTCONF PUT operation against a data resource. If a new
161 + * resource is successfully created, then the HTTP status code "201 Created"
162 + * is returned. If an existing resource is modified, then the HTTP
163 + * status code "204 No Content" is returned. If the input JSON payload
164 + * contains errors, then "400 Bad Request" is returned. If an exception
165 + * occurs during the operation, the status code enclosed in
166 + * the RestconfException object, such as "500 Internal Server Error",
167 + * is returned.
168 + *
169 + * @param uriString URI of the data resource.
170 + * @param stream Input JSON object
171 + * @return HTTP response
172 + */
173 + @PUT
174 + @Consumes(MediaType.APPLICATION_JSON)
175 + @Produces(MediaType.APPLICATION_JSON)
176 + @Path("data/{identifier : .+}")
177 + public Response handlePutRequest(@PathParam("identifier") String uriString, InputStream stream) {
178 +
179 + log.debug("handlePutRequest: {}", uriString);
180 +
181 + try {
182 + ObjectNode rootNode = (ObjectNode) mapper().readTree(stream);
183 +
184 + service.runPutOperationOnDataResource(uriString, rootNode);
185 + return Response.created(uriInfo.getRequestUri()).build();
186 + } catch (JsonProcessingException e) {
187 + log.error("ERROR: handlePutRequest ", e);
188 + return Response.status(Response.Status.BAD_REQUEST).build();
189 + } catch (RestconfException e) {
190 + log.error("ERROR: handlePutRequest: {}", e.getMessage());
191 + log.debug("Exception in handlePutRequest:", e);
192 + return e.getResponse();
193 + } catch (IOException ex) {
194 + log.error("ERROR: handlePutRequest ", ex);
195 + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
196 + }
197 + }
198 +
199 + /**
200 + * Handles the RESTCONF DELETION Operation against a data resource. If the
201 + * resource is successfully deleted, the HTTP status code "204 No Content"
202 + * is returned in the response. If an exception occurs, then the
203 + * HTTP status code enclosed in the RestconfException object is
204 + * returned.
205 + *
206 + * @param uriString URI of the data resource to be deleted.
207 + * @return HTTP response
208 + */
209 + @DELETE
210 + @Produces(MediaType.APPLICATION_JSON)
211 + @Path("data/{identifier : .+}")
212 + public Response handleDeleteRequest(@PathParam("identifier") String uriString) {
213 +
214 + log.debug("handleDeleteRequest: {}", uriString);
215 +
216 + try {
217 + service.runDeleteOperationOnDataResource(uriString);
218 + return Response.ok().build();
219 + } catch (RestconfException e) {
220 + log.error("ERROR: handleDeleteRequest: {}", e.getMessage());
221 + log.debug("Exception in handleDeleteRequest:", e);
222 + return e.getResponse();
223 + }
224 + }
225 +
226 +}
1 +/*
2 + * Copyright 2016-present 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 +/**
18 + * RESTCONF Protocol Proxy implementation.
19 + */
20 +package org.onosproject.protocol.restconf.server.rpp;
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + ~ Copyright 2016-present Open Networking Laboratory
4 + ~
5 + ~ Licensed under the Apache License, Version 2.0 (the "License");
6 + ~ you may not use this file except in compliance with the License.
7 + ~ You may obtain a copy of the License at
8 + ~
9 + ~ http://www.apache.org/licenses/LICENSE-2.0
10 + ~
11 + ~ Unless required by applicable law or agreed to in writing, software
12 + ~ distributed under the License is distributed on an "AS IS" BASIS,
13 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 + ~ See the License for the specific language governing permissions and
15 + ~ limitations under the License.
16 + -->
17 +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
18 + xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
19 + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
20 + id="ONOS" version="2.5">
21 + <display-name>ONOS RESTCONF Protocol Proxy</display-name>
22 +
23 + <servlet>
24 + <servlet-name>RESTCONF Protocol Proxy</servlet-name>
25 + <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
26 + <init-param>
27 + <param-name>javax.ws.rs.Application</param-name>
28 + <param-value>org.onosproject.protocol.restconf.server.rpp.RestconfProtocolProxy</param-value>
29 + </init-param>
30 + <load-on-startup>1</load-on-startup>
31 + </servlet>
32 +
33 + <servlet-mapping>
34 + <servlet-name>RESTCONF Protocol Proxy</servlet-name>
35 + <url-pattern>/*</url-pattern>
36 + </servlet-mapping>
37 +</web-app>