blob: 1baff3be3becd1e19509cee97c6182f51ec752ae [file] [log] [blame]
Sean Condon0e89bda2017-03-21 14:23:19 +00001/*
2 * Copyright 2017-present Open Networking Foundation
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 */
Sean Condon081290d2017-11-02 13:15:08 +000016package org.onosproject.cfm.rest;
Sean Condon0e89bda2017-03-21 14:23:19 +000017
18import java.io.InputStream;
19import java.net.URI;
20import java.util.Collection;
21
22import javax.ws.rs.Consumes;
23import javax.ws.rs.DELETE;
24import javax.ws.rs.GET;
25import javax.ws.rs.POST;
26import javax.ws.rs.Path;
27import javax.ws.rs.PathParam;
28import javax.ws.rs.Produces;
29import javax.ws.rs.core.MediaType;
30import javax.ws.rs.core.Response;
31
32import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
33import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
34import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
35import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
36import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
37import org.onosproject.rest.AbstractWebResource;
38import org.slf4j.Logger;
39import org.slf4j.LoggerFactory;
40
41import com.fasterxml.jackson.databind.JsonNode;
42import com.fasterxml.jackson.databind.ObjectMapper;
43import com.fasterxml.jackson.databind.node.ArrayNode;
44import com.fasterxml.jackson.databind.node.ObjectNode;
45
Ray Milkey86ee5e82018-04-02 15:33:07 -070046import static org.onlab.util.Tools.readTreeFromStream;
47
Sean Condon0e89bda2017-03-21 14:23:19 +000048/**
49 * Layer 2 CFM Maintenance Domain web resource.
50 */
51@Path("md")
52public class MdWebResource extends AbstractWebResource {
53 private final Logger log = LoggerFactory.getLogger(getClass());
Sean Condon0e89bda2017-03-21 14:23:19 +000054
55 /**
56 * Get all Maintenance Domains.
57 *
58 * @return 200 OK with a list of MDs and their children
59 */
60 @GET
61 @Produces(MediaType.APPLICATION_JSON)
62 @Consumes(MediaType.APPLICATION_JSON)
63 public Response getMds() {
64 log.debug("GET called for all MDs");
65 Collection<MaintenanceDomain> mdMap =
66 get(CfmMdService.class).getAllMaintenanceDomain();
67 ArrayNode arrayNode = mapper().createArrayNode();
68 arrayNode.add(codec(MaintenanceDomain.class).encode(mdMap, this));
69 return ok(mapper().createObjectNode().set("mds", arrayNode)).build();
70 }
71
72 /**
73 * Get Maintenance Domain by name.
74 *
75 * @param mdName The name of a Maintenance Domain
76 * @return 200 OK with the details of the MD and its children or 500 on error
77 */
78 @GET
79 @Path("{md_name}")
80 @Produces(MediaType.APPLICATION_JSON)
81 @Consumes(MediaType.APPLICATION_JSON)
82 public Response getMd(@PathParam("md_name") String mdName) {
83 log.debug("GET called for MD {}", mdName);
84 try {
85 MaintenanceDomain md = get(CfmMdService.class)
Sean Condon96b896d2017-12-11 12:44:29 -080086 //FIXME Handle other types of name constructs e.g. DomainName
Sean Condon0e89bda2017-03-21 14:23:19 +000087 .getMaintenanceDomain(MdIdCharStr.asMdId(mdName))
88 .orElseThrow(() -> new IllegalArgumentException(
89 "MD " + mdName + " not Found"));
90 ObjectNode result = mapper().createObjectNode();
91 result.set("md", codec(MaintenanceDomain.class).encode(md, this));
92 return ok(result.toString()).build();
93 } catch (IllegalArgumentException e) {
94 log.error("Get MD {} failed", mdName, e);
95 return Response.serverError()
96 .entity("{ \"failure\":\"" + e.toString() + "\" }").build();
97 }
98 }
99
100 /**
101 * Delete Maintenance Domain by name.
102 *
103 * @param mdName The name of a Maintenance Domain
104 * @return 200 OK, or 304 if not found or 500 on error
105 */
106 @DELETE
107 @Path("{md_name}")
108 @Consumes(MediaType.APPLICATION_JSON)
109 @Produces(MediaType.APPLICATION_JSON)
110 public Response deleteMd(@PathParam("md_name") String mdName) {
111 log.debug("DELETE called for MD {}", mdName);
112 try {
113 MdId mdId = MdIdCharStr.asMdId(mdName);
114 boolean deleted = get(CfmMdService.class).deleteMaintenanceDomain(mdId);
115 if (!deleted) {
116 return Response.notModified(mdName + " did not exist").build();
117 } else {
118 return ok("{ \"success\":\"deleted " + mdName + "\" }").build();
119 }
120 } catch (CfmConfigException e) {
121 log.error("Delete Maintenance Domain {} failed", mdName, e);
122 return Response.serverError()
123 .entity("{ \"failure\":\"" + e.toString() + "\" }").build();
124 }
125 }
126
127 /**
128 * Create Maintenance Domain.
129 *
Sean Condon081290d2017-11-02 13:15:08 +0000130 * @onos.rsModel MdCreate
Sean Condon0e89bda2017-03-21 14:23:19 +0000131 * @param input A JSON formatted input stream specifying the MA parameters
132 * @return 200 OK, 304 if MD already exists or 500 on error
133 */
134 @POST
135 @Consumes(MediaType.APPLICATION_JSON)
136 @Produces(MediaType.APPLICATION_JSON)
137 public Response createMaintenanceDomain(InputStream input) {
138 log.debug("POST called to Create MD");
139 try {
140 ObjectMapper mapper = new ObjectMapper();
Ray Milkey86ee5e82018-04-02 15:33:07 -0700141 JsonNode cfg = readTreeFromStream(mapper, input);
Sean Condon0e89bda2017-03-21 14:23:19 +0000142 MaintenanceDomain md = codec(MaintenanceDomain.class).decode((ObjectNode) cfg, this);
143
144 if (get(CfmMdService.class).createMaintenanceDomain(md)) {
145 return Response.notModified(md.mdId().toString() + " already exists").build();
146 }
147 return Response
148 .created(new URI("md/" + md.mdId()))
149 .entity("{ \"success\":\"" + md.mdId() + " created\" }")
150 .build();
151
152 } catch (Exception | CfmConfigException e) {
153 log.error("Create MaintenanceDomain", e);
154 return Response.serverError()
155 .entity("{ \"failure\":\"" + e.toString() + "\" }")
156 .build();
157 }
158 }
159}