package org.cloudfoundry.community.servicebroker.brooklyn.controller;
import org.apache.brooklyn.util.stream.Streams;
import org.cloudfoundry.community.servicebroker.brooklyn.model.BrooklynServiceInstance;
import org.cloudfoundry.community.servicebroker.brooklyn.repository.BrooklynServiceInstanceRepository;
import org.cloudfoundry.community.servicebroker.brooklyn.service.BrooklynRestAdmin;
import org.cloudfoundry.community.servicebroker.brooklyn.service.ServiceUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.servicebroker.model.ServiceInstance;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
import java.io.InputStream;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.Future;
@RestController
public class BrooklynController {
private BrooklynRestAdmin admin;
private BrooklynServiceInstanceRepository instanceRepository;
@Autowired
public BrooklynController(BrooklynRestAdmin admin, BrooklynServiceInstanceRepository instanceRepository) {
this.admin = admin;
this.instanceRepository = instanceRepository;
}
@RequestMapping(value = "/create", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED)
public void create(InputStream uploadedInputStream){
admin.postBlueprint(Streams.readFullyString(uploadedInputStream));
// TODO create a response
}
@RequestMapping(value = "/delete/{name}/{version:.+}/", method = RequestMethod.DELETE)
public void delete(@PathVariable("name") String name, @PathVariable("version") String version){
try {
admin.deleteCatalogEntry(name, version);
} catch (Exception e) {
// TODO create a response
e.printStackTrace();
}
}
@RequestMapping(value = "/invoke/{application}/{entity}/{effector}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON)
public Object invoke(
@PathVariable("application") String application,
@PathVariable("entity") String entity,
@PathVariable("effector") String effector,
@RequestBody Map<String, Object> params) {
BrooklynServiceInstance instance = instanceRepository.findOne(application);
if (instance != null) {
String appId = instance.getServiceDefinitionId();
return admin.invokeEffector(appId, entity, effector, params);
}
return new Object();
}
@RequestMapping(value = "/effectors/{application}", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> effectors(@PathVariable("application") String application){
BrooklynServiceInstance instance = instanceRepository.findOne(application);
if (instance != null) {
String appId = instance.getServiceDefinitionId();
Future<Map<String, Object>> applicationEffectorsFuture = admin.getApplicationEffectors(appId);
return ServiceUtil.getFutureValueLoggingError(applicationEffectorsFuture);
}
System.out.println(instanceRepository);
return Collections.emptyMap();
}
@RequestMapping(value = "/sensors/{application}", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> sensors(@PathVariable("application") String application) {
BrooklynServiceInstance instance = instanceRepository.findOne(application);
if (instance != null) {
String appId = instance.getServiceDefinitionId();
Future<Map<String, Object>> applicationSensorsFuture = admin.getApplicationSensors(appId);
return ServiceUtil.getFutureValueLoggingError(applicationSensorsFuture);
}
System.out.println(instanceRepository);
return Collections.emptyMap();
}
@RequestMapping(value = "/is-running/{application}")
public @ResponseBody Boolean isRunning(@PathVariable("application") String application) {
BrooklynServiceInstance instance = instanceRepository.findOne(application);
if (instance != null) {
String appId = instance.getServiceDefinitionId();
Future<Boolean> applicationRunningFuture = admin.isApplicationRunning(appId);
return ServiceUtil.getFutureValueLoggingError(applicationRunningFuture);
}
return false;
}
}