Refine access control, peer access
[federation.git] / gateway / src / main / java / org / acumos / federation / gateway / controller / PeerController.java
1 /*-
2  * ===============LICENSE_START=======================================================
3  * Acumos
4  * ===================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property & Tech Mahindra. All rights reserved.
6  * ===================================================================================
7  * This Acumos software file is distributed by AT&T and Tech Mahindra
8  * under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *  
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *  
14  * This file 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
21 package org.acumos.federation.gateway.controller;
22
23 import java.util.List;
24
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27
28 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.core.io.InputStreamResource;
30 import org.springframework.http.HttpEntity;
31 import org.springframework.http.MediaType;
32 import org.springframework.http.ResponseEntity;
33 import org.springframework.security.access.prepost.PreAuthorize;
34 import org.springframework.security.core.context.SecurityContextHolder;
35 import org.springframework.stereotype.Controller;
36 import org.springframework.web.util.UriComponentsBuilder;
37 import org.springframework.web.bind.annotation.CrossOrigin;
38 import org.springframework.web.bind.annotation.PathVariable;
39 import org.springframework.web.bind.annotation.RequestMapping;
40 import org.springframework.web.bind.annotation.RequestMethod;
41 import org.springframework.web.bind.annotation.RequestParam;
42 import org.springframework.web.bind.annotation.ResponseBody;
43
44 import org.acumos.cds.domain.MLPPeer;
45 import org.acumos.federation.gateway.common.JSONTags;
46 import org.acumos.federation.gateway.common.JsonResponse;
47 import org.acumos.federation.gateway.config.APINames;
48 import org.acumos.federation.gateway.config.EELFLoggerDelegate;
49 import org.acumos.federation.gateway.service.PeerService;
50 import org.acumos.federation.gateway.service.ServiceContext;
51 import org.acumos.federation.gateway.security.Peer;
52
53 import io.swagger.annotations.ApiOperation;
54
55 /**
56  * 
57  *
58  */
59 @Controller
60 @RequestMapping("/")
61 public class PeerController extends AbstractController {
62         
63         
64         @Autowired
65         PeerService peerService;
66         
67         /**
68          * @param request
69          *            HttpServletRequest
70          * @param response
71          *                      HttpServletResponse
72          * @return List of Published ML Solutions in JSON format.
73          */
74         @CrossOrigin
75         @PreAuthorize("hasAuthority('PEERS_ACCESS')")
76         @ApiOperation(value = "Invoked by Peer Acumos to get a list of peers from local Acumos Instance .", response = MLPPeer.class, responseContainer = "List")
77         @RequestMapping(value = {APINames.PEER_PEERS}, method = RequestMethod.GET, produces = APPLICATION_JSON)
78         @ResponseBody
79         public JsonResponse<List<MLPPeer>> getSolutions(
80                         /* HttpServletRequest theHttpRequest,*/
81                         HttpServletResponse theHttpResponse) {
82
83                 JsonResponse<List<MLPPeer>> response = null;
84                 List<MLPPeer> peers = null;
85                 log.debug(EELFLoggerDelegate.debugLogger, APINames.PEER_PEERS);
86                 try {
87                         response = new JsonResponse<List<MLPPeer>>();
88                         log.debug(EELFLoggerDelegate.debugLogger, "getPeers");
89
90                         peers = peerService.getPeers(new ControllerContext());
91 /*
92  * TODO: We only expose simple peers, not the partners.
93  * But we only serve this service
94  * to parners so .. ?? No pb.
95  */
96                         if(peers != null) {
97                                 response.setResponseBody(peers);
98                                 response.setResponseCode(String.valueOf(HttpServletResponse.SC_OK));
99                                 response.setResponseDetail(JSONTags.TAG_STATUS_SUCCESS);
100                                 response.setStatus(true);
101                                 theHttpResponse.setStatus(HttpServletResponse.SC_OK);
102                                 log.debug(EELFLoggerDelegate.debugLogger, "getPeers: size is " + peers.size());
103                         }
104                 } catch (Exception e) {
105                         response.setResponseCode(String.valueOf(HttpServletResponse.SC_BAD_REQUEST));
106                         response.setResponseDetail(JSONTags.TAG_STATUS_FAILURE);
107                         response.setStatus(false);
108                         theHttpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
109                         log.error(EELFLoggerDelegate.errorLogger, "Exception Occurred Fetching Peers", e);
110                 }
111                 return response;
112         }
113
114         protected class ControllerContext implements ServiceContext {
115
116                 public Peer getPeer() {
117                         return (Peer)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
118                 }
119         }
120 }
121