package com.clouck.webapp.controller; import java.util.List; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.clouck.converter.RepConverter; import com.clouck.exception.CloudVersionException; import com.clouck.model.Region; import com.clouck.model.ResourceType; import com.clouck.model.aws.AbstractResource; import com.clouck.model.aws.ec2.Ec2VersionMeta; import com.clouck.service.AwsService; import com.clouck.service.EventService; import com.google.common.base.Optional; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @Controller @RequestMapping("/accounts/{accountId}/ec2") public class Ec2Controller extends AbstractController { private static final Logger log = LoggerFactory.getLogger(Ec2Controller.class); @Autowired private AwsService awsService; @Autowired private UserPreference userPreference; @Autowired private EventService eventService; @Autowired private RepConverter converter; @RequestMapping(value = "/overview", method = RequestMethod.GET) public String loadOverview(Model model, @PathVariable String accountId, @RequestParam(value = "region", required = false) String regionEndpoint) { log.debug("loading overview page"); prep(accountId, regionEndpoint, model); Region region = findRegion(regionEndpoint); Pageable pageable = new PageRequest(0, 10); List<Ec2VersionMeta> ec2VersionMetas = awsService.findEc2VersionMetasOrderByTimeDetectedDesc(accountId, region, pageable); model.addAttribute("ec2VersionMetaReps", converter.toEc2VersionMetaReps(ec2VersionMetas)); for (ResourceType rt : ResourceType.findViewResourceTypes()) { model.addAttribute(rt.findVariableName(), awsService.findLatestResourceSizes(accountId, rt, region)); } model.addAttribute("millis", DateTime.now().toInstant().getMillis()); return "ec2-overview"; } @RequestMapping(value = "/{resourceType}/{resourceId}/history", method = RequestMethod.GET) public String loadHistory(Model model, @PathVariable String accountId, @PathVariable String resourceType, @PathVariable String resourceId, @RequestParam(value = "region", required = false) String regionEndpoint) { log.debug("load resource history page.."); prep(accountId, regionEndpoint, model); ResourceType rt = ResourceType.find(resourceType); Region region = findRegion(regionEndpoint); @SuppressWarnings("rawtypes") Optional<AbstractResource> oResource = awsService.findResource(resourceId, ResourceType.find(resourceType)); if (oResource.isPresent()) { String uniqueId = oResource.get().getUniqueId(); //TODO: this is incorrect, as uniqueId could be two ids combination List<Ec2VersionMeta> ec2VersionMetas = awsService.findEc2VersionMetasOrderByTimeDetectedDesc(accountId, region, rt, uniqueId); model.addAttribute("ec2ResourceReps", converter.toEc2ResourceReps(ec2VersionMetas, uniqueId)); model.addAttribute("resourceId", resourceId); model.addAttribute("uniqueId", uniqueId); model.addAttribute("numOfEc2VersionMetas", ec2VersionMetas.size()); } else { throw new CloudVersionException("invalid request, id:" + resourceId + "don't exist"); } return rt.findResourceHistoryPage(); } @RequestMapping(value = "/{resourceType}", method = RequestMethod.GET) public String loadCurrentResources(Model model, @PathVariable String accountId, @PathVariable String resourceType, @RequestParam(required = false) String format, @RequestParam(required = true) Long at, @RequestParam(value = "region", required = false) String regionEndpoint) { ResourceType rt = ResourceType.find(resourceType); log.debug("loading {} page", rt); prep(accountId, regionEndpoint, model); Region region = findRegion(regionEndpoint); DateTime dt = new DateTime(at); List<AbstractResource<?>> ec2Resources = awsService.findResourcesAt(accountId, rt, region, dt); model.addAttribute("ec2Resources", ec2Resources); model.addAttribute("numOfEc2VersionMetas", awsService.countEc2VersionMetas(accountId, rt, region)); model.addAttribute("at", dt.toDate()); if (format == null) { return rt.findResourcesPage(); } else { Gson gson = new GsonBuilder().setPrettyPrinting().create(); String ec2ResourcesJson = gson.toJson(converter.toResources(ec2Resources)); model.addAttribute("ec2ResourcesJson", ec2ResourcesJson); return rt.findResourcesRawPage(); } } @RequestMapping(value = "/{resourceType}/{resourceId}", method = RequestMethod.GET) public String loadResource(Model model, @PathVariable String accountId, @PathVariable String resourceType, @PathVariable String resourceId, @RequestParam(value = "region", required = false) String regionEndpoint, @RequestParam long at, @RequestParam(required = false) String format) { log.debug("loading resources page.."); prep(accountId, regionEndpoint, model); Region region = findRegion(regionEndpoint); ResourceType rt = ResourceType.find(resourceType); DateTime dt = new DateTime(at); @SuppressWarnings("rawtypes") Optional<AbstractResource> oResource = awsService.findResource(resourceId, ResourceType.find(resourceType)); if (oResource.isPresent()) { model.addAttribute("ec2Resource", oResource.get()); model.addAttribute("at", dt.toDate()); if (format == null) { String uniqueId = oResource.get().getUniqueId(); long numOfEc2VersionMetas = awsService.countEc2VersionMetas(accountId, rt, region, uniqueId); model.addAttribute("numOfEc2VersionMetas", numOfEc2VersionMetas); model.addAttribute("ownerId", accountService.find(accountId).get().getAccountNumber()); return rt.findResourcePage(); } else { Gson gson = new GsonBuilder().setPrettyPrinting().create(); String ec2ResourceJson = gson.toJson(oResource.get().getResource()); model.addAttribute("ec2ResourceJson", ec2ResourceJson); return rt.findResourceRawPage(); } } else { throw new CloudVersionException("invalid request, id:" + resourceId + "don't exist"); } } @RequestMapping(value = "/{resourceType}/versions", method = RequestMethod.GET) public String loadResourcesHistory(Model model, @PathVariable String accountId, @PathVariable String resourceType, @RequestParam(value = "region", required = false) String regionEndpoint) { log.debug("loading resources page.."); prep(accountId, regionEndpoint, model); ResourceType rt = ResourceType.find(resourceType); Region region = findRegion(regionEndpoint); // model.addAttribute("numOfEc2VersionMetas", awsService.countEc2VersionMetas(accountId, rt, region)); return rt.findResourcesHistoryPage(); } }