/*
*
* * Copyright 2000-2014 JetBrains s.r.o.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package jetbrains.buildServer.clouds.vmware.web;
import com.intellij.openapi.diagnostic.Logger;
import java.net.URL;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jetbrains.buildServer.BuildProject;
import jetbrains.buildServer.clouds.vmware.VmwareConstants;
import jetbrains.buildServer.clouds.vmware.connector.*;
import jetbrains.buildServer.clouds.vmware.connector.beans.FolderBean;
import jetbrains.buildServer.clouds.vmware.connector.beans.ResourcePoolBean;
import jetbrains.buildServer.clouds.vmware.errors.VmwareErrorMessages;
import jetbrains.buildServer.controllers.ActionErrors;
import jetbrains.buildServer.controllers.BaseFormXmlController;
import jetbrains.buildServer.controllers.BasePropertiesBean;
import jetbrains.buildServer.controllers.admin.projects.PluginPropertiesUtil;
import jetbrains.buildServer.serverSide.SBuildServer;
import jetbrains.buildServer.serverSide.agentPools.AgentPool;
import jetbrains.buildServer.serverSide.agentPools.AgentPoolManager;
import jetbrains.buildServer.serverSide.agentPools.AgentPoolUtil;
import jetbrains.buildServer.web.openapi.*;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.servlet.ModelAndView;
/**
* @author Sergey.Pak
* Date: 5/28/2014
* Time: 2:58 PM
*/
public class VMWareEditProfileController extends BaseFormXmlController {
private static final Logger LOG = Logger.getInstance(VMWareEditProfileController.class.getName());
@NotNull private final String myJspPath;
@NotNull private final String myHtmlPath;
@NotNull private final String mySnapshotsPath;
@NotNull private final PluginDescriptor myPluginDescriptor;
@NotNull private final AgentPoolManager myAgentPoolManager;
public VMWareEditProfileController(@NotNull final SBuildServer server,
@NotNull final PluginDescriptor pluginDescriptor,
@NotNull final WebControllerManager manager,
@NotNull final AgentPoolManager agentPoolManager) {
super(server);
myHtmlPath = pluginDescriptor.getPluginResourcesPath("vmware-settings.html");
myPluginDescriptor = pluginDescriptor;
myAgentPoolManager = agentPoolManager;
myJspPath = myPluginDescriptor.getPluginResourcesPath("vmware-settings.jsp");
mySnapshotsPath = pluginDescriptor.getPluginResourcesPath("vmware-getsnapshotlist.html");
manager.registerController(myHtmlPath, this);
manager.registerController(pluginDescriptor.getPluginResourcesPath("vmware-getsnapshotlist.html"), new GetSnapshotsListController());
}
@Override
protected ModelAndView doGet(@NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response) {
final ModelAndView mv = new ModelAndView(myJspPath);
final String projectId = request.getParameter("projectId");
mv.getModel().put("refreshablePath", myHtmlPath);
mv.getModel().put("refreshSnapshotsPath", mySnapshotsPath);
mv.getModel().put("resPath", myPluginDescriptor.getPluginResourcesPath());
final List<AgentPool> pools = new ArrayList<>();
// TODO improve
if (!BuildProject.ROOT_PROJECT_ID.equals(projectId))
pools.add(AgentPoolUtil.DUMMY_PROJECT_POOL);
pools.addAll(myAgentPoolManager.getProjectOwnedAgentPools(projectId));
mv.getModel().put("agentPools", pools);
return mv;
}
@Override
protected void doPost(@NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response, @NotNull final Element xmlResponse) {
final ActionErrors errors = new ActionErrors();
final BasePropertiesBean propsBean = new BasePropertiesBean(null);
PluginPropertiesUtil.bindPropertiesFromRequest(request, propsBean, true);
final Map<String, String> props = propsBean.getProperties();
final String serverUrl = props.get(VMWareWebConstants.SERVER_URL);
final String username = props.get(VMWareWebConstants.USERNAME);
final String password = props.get(VMWareWebConstants.SECURE_PASSWORD);
try {
final VMWareApiConnector myApiConnector = VmwareApiConnectorsPool.getOrCreateConnector(new URL(serverUrl), username, password, null, null, null);
myApiConnector.test();
xmlResponse.addContent(getVirtualMachinesAsElement(myApiConnector.getVirtualMachines(true)));
xmlResponse.addContent(getFoldersAsElement(myApiConnector.getFolders()));
xmlResponse.addContent(getResourcePoolsAsElement(myApiConnector.getResourcePools()));
xmlResponse.addContent(getCustomizationSpecsAsElement(myApiConnector.getCustomizationSpecs()));
} catch (Exception ex) {
LOG.warnAndDebugDetails("Unable to get vCenter details: " + ex.toString(), ex);
errors.addError(
"errorFetchResults",
VmwareErrorMessages.getInstance().getFriendlyErrorMessage(
ex, "Please check the connection parameters. See the teamcity-clouds.log for details")
);
writeErrors(xmlResponse, errors);
}
}
private Element getVirtualMachinesAsElement(@NotNull final List<VmwareInstance> instances){
final Element element = new Element("VirtualMachines");
for (VmwareInstance vm : instances) {
Element vmElement = new Element("VirtualMachine");
vmElement.setAttribute("name", vm.getName());
vmElement.setAttribute("template", String.valueOf(vm.isReadonly()));
vmElement.setAttribute("datacenterId", vm.getDatacenterId());
element.addContent(vmElement);
}
return element;
}
private Element getFoldersAsElement(List<FolderBean> folders){
final Element element = new Element("Folders");
for (FolderBean folder : folders) {
Element folderElement = new Element("Folder");
folderElement.setAttribute("name", folder.getPath());
folderElement.setAttribute("value", folder.getId());
folderElement.setAttribute("datacenterId", folder.getDatacenterId());
element.addContent(folderElement);
}
return element;
}
private Element getResourcePoolsAsElement(List<ResourcePoolBean> resourcePools){
final Element element = new Element("ResourcePools");
final Element defaultPoolElem = new Element("ResourcePool");
defaultPoolElem.setAttribute("name", "<Default>");
defaultPoolElem.setAttribute("value", VmwareConstants.DEFAULT_RESOURCE_POOL);
element.addContent(defaultPoolElem);
for (ResourcePoolBean pool : resourcePools) {
Element poolElement = new Element("ResourcePool");
poolElement.setAttribute("name", pool.getPath());
poolElement.setAttribute("value", pool.getId());
poolElement.setAttribute("datacenterId", pool.getDatacenterId());
element.addContent(poolElement);
}
return element;
}
private Element getCustomizationSpecsAsElement(Map<String, String> customizationSpecs){
final Element element = new Element("CustomizationSpecs");
final List<String> sortedList = getIgnoreCaseSortedList(customizationSpecs.keySet());
for (String specName : sortedList) {
Element specElement = new Element("CustomizationSpec");
specElement.setAttribute("name", specName);
specElement.setAttribute("type", customizationSpecs.get(specName));
element.addContent(specElement);
}
return element;
}
private List<String> getIgnoreCaseSortedList(Collection<String> src){
final List<String> sortedList = new ArrayList<String>(src);
Collections.sort(sortedList, new Comparator<String>() {
public int compare(final String o1, final String o2) {
return o1.compareToIgnoreCase(o2);
}
});
return sortedList;
}
}