Add tests to improve code-coverage stats in Sonar
[portal/ric-dashboard.git] / dashboard / webapp-backend / src / main / java / org / oransc / ric / portal / dashboard / controller / AdminController.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2019 AT&T Intellectual Property
6  * %%
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ========================LICENSE_END===================================
19  */
20 package org.oransc.ric.portal.dashboard.controller;
21
22 import java.io.IOException;
23 import java.lang.invoke.MethodHandles;
24 import java.util.List;
25
26 import org.onap.portalsdk.core.restful.domain.EcompUser;
27 import org.oransc.ric.portal.dashboard.AppStatsManager;
28 import org.oransc.ric.portal.dashboard.DashboardApplication;
29 import org.oransc.ric.portal.dashboard.DashboardConstants;
30 import org.oransc.ric.portal.dashboard.DashboardUserManager;
31 import org.oransc.ric.portal.dashboard.exception.StatsManagerException;
32 import org.oransc.ric.portal.dashboard.model.AppStats;
33 import org.oransc.ric.portal.dashboard.model.IDashboardResponse;
34 import org.oransc.ric.portal.dashboard.model.RicRegion;
35 import org.oransc.ric.portal.dashboard.model.RicRegionList;
36 import org.oransc.ric.portal.dashboard.model.RicRegionTransport;
37 import org.oransc.ric.portal.dashboard.model.StatsDetailsTransport;
38 import org.oransc.ric.portal.dashboard.model.SuccessTransport;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41 import org.springframework.beans.factory.annotation.Autowired;
42 import org.springframework.http.MediaType;
43 import org.springframework.http.ResponseEntity;
44 import org.springframework.security.access.annotation.Secured;
45 import org.springframework.web.bind.annotation.DeleteMapping;
46 import org.springframework.web.bind.annotation.GetMapping;
47 import org.springframework.web.bind.annotation.PathVariable;
48 import org.springframework.web.bind.annotation.PostMapping;
49 import org.springframework.web.bind.annotation.PutMapping;
50 import org.springframework.web.bind.annotation.RequestBody;
51 import org.springframework.web.bind.annotation.RequestMapping;
52 import org.springframework.web.bind.annotation.RestController;
53
54 import io.swagger.annotations.ApiOperation;
55
56 /**
57  * Answers REST requests for admin services like version, health etc.
58  */
59 @RestController
60 @RequestMapping(value = AdminController.CONTROLLER_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
61 public class AdminController {
62
63         private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
64
65         // Publish paths in constants so tests are easy to write
66         public static final String CONTROLLER_PATH = DashboardConstants.ENDPOINT_PREFIX + "/admin";
67         public static final String HEALTH_METHOD = "health";
68         public static final String INSTANCE_METHOD = "instance";
69         public static final String USER_METHOD = "user";
70         public static final String VERSION_METHOD = DashboardConstants.VERSION_METHOD;
71         public static final String XAPPMETRICS_METHOD = "metrics";
72         public static final String STATAPPMETRIC_METHOD = "appmetric";
73
74         @Autowired
75         private DashboardUserManager dashboardUserManager;
76
77         @Autowired
78         private AppStatsManager appStatsManager;
79
80         @Autowired
81         private RicRegionList instanceConfig;
82
83         @ApiOperation(value = "Gets the Dashboard MANIFEST.MF property Implementation-Version.", response = SuccessTransport.class)
84         @GetMapping(VERSION_METHOD)
85         // No role required
86         public SuccessTransport getVersion() {
87                 // These endpoints are invoked repeatedly by K8S
88                 logger.trace("getVersion");
89                 return new SuccessTransport(200,
90                                 DashboardApplication.getImplementationVersion(MethodHandles.lookup().lookupClass()));
91         }
92
93         @ApiOperation(value = "Checks the health of the application.", response = SuccessTransport.class)
94         @GetMapping(HEALTH_METHOD)
95         // No role required
96         public SuccessTransport getHealth() {
97                 // These endpoints are invoked repeatedly by K8S
98                 logger.trace("getHealth");
99                 return new SuccessTransport(200, "Dashboard is healthy!");
100         }
101
102         @ApiOperation(value = "Gets the list of application users.", response = EcompUser.class, responseContainer = "List")
103         @GetMapping(USER_METHOD)
104         @Secured({ DashboardConstants.ROLE_ADMIN }) // regular users should not see this
105         public List<EcompUser> getUsers() {
106                 logger.debug("getUsers");
107                 return dashboardUserManager.getUsers();
108         }
109
110         @ApiOperation(value = "Gets the RIC regions and instances.", response = RicRegion.class, responseContainer = "List")
111         @GetMapping(INSTANCE_METHOD)
112         @Secured({ DashboardConstants.ROLE_ADMIN, DashboardConstants.ROLE_STANDARD })
113         public List<RicRegionTransport> getRegionsInstances() {
114                 logger.debug("getRegionsInstances");
115                 return instanceConfig.getSimpleInstances();
116         }
117
118         @ApiOperation(value = "Gets all xApp statistics reporting details.", response = StatsDetailsTransport.class, responseContainer = "List")
119         @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/"
120                         + STATAPPMETRIC_METHOD)
121         @Secured({ DashboardConstants.ROLE_ADMIN, DashboardConstants.ROLE_STANDARD })
122         public List<AppStats> getStats(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey) {
123                 logger.debug("getStats for instance {}", instanceKey);
124                 return appStatsManager.getStatsByInstance(instanceKey);
125         }
126
127         @ApiOperation(value = "Gets a xApp's metrics status by Id.", response = StatsDetailsTransport.class, responseContainer = "List")
128         @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/"
129                         + STATAPPMETRIC_METHOD + "/" + DashboardConstants.APP_ID + "/{" + DashboardConstants.APP_ID + "}")
130         @Secured({ DashboardConstants.ROLE_ADMIN, DashboardConstants.ROLE_STANDARD })
131         public AppStats getStatsById(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
132                         @PathVariable(DashboardConstants.APP_ID) int appId) {
133                 logger.debug("getStatsById for instance {} by app id {}", instanceKey, appId);
134                 return appStatsManager.getStatsById(instanceKey, appId);
135         }
136
137         @ApiOperation(value = "Creates xApp metrics status.")
138         @PostMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/"
139                         + STATAPPMETRIC_METHOD)
140         @Secured({ DashboardConstants.ROLE_ADMIN })
141         public IDashboardResponse createStats(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
142                         @RequestBody StatsDetailsTransport statsSetupRequest) throws StatsManagerException, IOException {
143                 logger.debug("createStats with instance {} request {}", instanceKey, statsSetupRequest);
144                 return appStatsManager.createStats(instanceKey, statsSetupRequest);
145         }
146
147         @ApiOperation(value = "Updates xApp metrics status.")
148         @PutMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/"
149                         + STATAPPMETRIC_METHOD)
150         @Secured({ DashboardConstants.ROLE_ADMIN })
151         public void updateStats(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
152                         @RequestBody StatsDetailsTransport statsSetupRequest) throws StatsManagerException, IOException {
153                 logger.debug("updateStats for instance {} request {}", instanceKey, statsSetupRequest);
154                 appStatsManager.updateStats(instanceKey, statsSetupRequest);
155         }
156
157         @ApiOperation(value = "Deletes xApp metric status.")
158         @DeleteMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/"
159                         + STATAPPMETRIC_METHOD + "/" + DashboardConstants.APP_ID + "/{" + DashboardConstants.APP_ID + "}")
160         @Secured({ DashboardConstants.ROLE_ADMIN })
161         public ResponseEntity<String> deleteStats(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
162                         @PathVariable(DashboardConstants.APP_ID) int appId) throws StatsManagerException, IOException {
163                 logger.debug("deleteStats instance {} request {}", instanceKey, appId);
164                 appStatsManager.deleteStats(instanceKey, appId);
165                 return ResponseEntity.ok(null);
166         }
167 }