package de.cinovo.cloudconductor.server.rest.impl; /* * #%L * cloudconductor-server * %% * Copyright (C) 2013 - 2014 Cinovo AG * %% * 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. * #L% */ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; import de.cinovo.cloudconductor.server.dao.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import de.cinovo.cloudconductor.api.interfaces.ITemplate; import de.cinovo.cloudconductor.api.model.Host; import de.cinovo.cloudconductor.api.model.PackageVersion; import de.cinovo.cloudconductor.api.model.SSHKey; import de.cinovo.cloudconductor.api.model.Service; import de.cinovo.cloudconductor.api.model.Template; import de.cinovo.cloudconductor.server.comparators.PackageVersionComparator; import de.cinovo.cloudconductor.server.model.EHost; import de.cinovo.cloudconductor.server.model.EPackageVersion; import de.cinovo.cloudconductor.server.model.ESSHKey; import de.cinovo.cloudconductor.server.model.EService; import de.cinovo.cloudconductor.server.model.EServiceState; import de.cinovo.cloudconductor.server.model.ETemplate; import de.cinovo.cloudconductor.server.rest.helper.AMConverter; import de.cinovo.cloudconductor.server.rest.helper.MAConverter; import de.taimos.restutils.RESTAssert; import de.taimos.springcxfdaemon.JaxRsComponent; /** * Copyright 2013 Cinovo AG<br> * <br> * * @author psigloch * */ @JaxRsComponent public class TemplateImpl extends ImplHelper implements ITemplate { @Autowired private ITemplateDAO dtemplate; @Autowired private IPackageVersionDAO drpm; @Autowired private IHostDAO dhost; @Autowired private IServiceDAO dsvc; @Autowired private IServiceStateDAO dsst; @Autowired private IServiceDefaultStateDAO ddsst; @Autowired private ISSHKeyDAO dssh; @Autowired private IFileDAO dcf; @Autowired private IDirectoryDAO ddir; @Autowired private AMConverter amc; private PackageVersionComparator rpmComp = new PackageVersionComparator(); @Override @Transactional public Template[] get() { Set<Template> result = new HashSet<>(); for (ETemplate m : this.dtemplate.findList()) { result.add(MAConverter.fromModel(m)); } return result.toArray(new Template[result.size()]); } @Override @Transactional public void save(String name, Template apiObject) { this.assertName(name, apiObject); ETemplate model = this.amc.toModel(apiObject); if ((apiObject.getRpms() != null) && !apiObject.getRpms().isEmpty()) { List<EPackageVersion> found = new ArrayList<>(); for (Entry<String, String> s : apiObject.getRpms().entrySet()) { EPackageVersion rpm = this.drpm.find(s.getKey(), s.getValue()); this.assertModelFound(rpm); found.add(rpm); } model.setPackageVersions(found); } else { model.setPackageVersions(null); } if ((apiObject.getHosts() != null) && !apiObject.getHosts().isEmpty()) { model.setHosts(this.findByName(this.dhost, apiObject.getHosts())); } else { model.setHosts(null); } if ((apiObject.getSshkeys() != null) && !apiObject.getSshkeys().isEmpty()) { model.setSshkeys(this.findByName(this.dssh, apiObject.getSshkeys())); } else { model.setSshkeys(null); } if ((apiObject.getConfigFiles() != null) && !apiObject.getConfigFiles().isEmpty()) { model.setConfigFiles(this.findByName(this.dcf, apiObject.getConfigFiles())); } else { model.setConfigFiles(null); } if ((apiObject.getDirectories() != null) && !apiObject.getDirectories().isEmpty()) { model.setDirectory(this.findByName(this.ddir, apiObject.getDirectories())); } else { model.setDirectory(null); } this.dtemplate.save(model); } @Override @Transactional public Template get(String name) { RESTAssert.assertNotEmpty(name); ETemplate model = this.findByName(this.dtemplate, name); return MAConverter.fromModel(model); } @Override @Transactional public void delete(String name) { RESTAssert.assertNotEmpty(name); ETemplate model = this.dtemplate.findByName(name); this.assertModelFound(model); this.dtemplate.delete(model); } @Override @Transactional public Host[] getHosts(String name) { RESTAssert.assertNotEmpty(name); ETemplate model = this.findByName(this.dtemplate, name); Set<Host> result = new HashSet<>(); for (EHost p : model.getHosts()) { result.add(MAConverter.fromModel(p)); } return result.toArray(new Host[result.size()]); } @Override @Transactional public void addHost(String name, String host) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotEmpty(host); ETemplate model = this.findByName(this.dtemplate, name); EHost element = this.findByName(this.dhost, host); model.getHosts().add(element); this.dtemplate.save(model); } @Override @Transactional public void removeHost(String name, String host) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotEmpty(host); ETemplate model = this.findByName(this.dtemplate, name); EHost element = this.findByName(this.dhost, host); model.getHosts().remove(element); this.dtemplate.save(model); } @Override @Transactional public SSHKey[] getSSHKeys(String name) { RESTAssert.assertNotEmpty(name); ETemplate model = this.findByName(this.dtemplate, name); Set<SSHKey> result = new HashSet<>(); for (ESSHKey p : model.getSshkeys()) { result.add(MAConverter.fromModel(p)); } return result.toArray(new SSHKey[result.size()]); } @Override @Transactional public void addSSHKey(String name, String key) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotEmpty(key); ETemplate model = this.findByName(this.dtemplate, name); ESSHKey element = this.findByName(this.dssh, key); model.getSshkeys().add(element); this.dtemplate.save(model); } @Override @Transactional public void removeSSHKey(String name, String key) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotEmpty(key); ETemplate model = this.findByName(this.dtemplate, name); ESSHKey element = this.findByName(this.dssh, key); model.getSshkeys().remove(element); this.dtemplate.save(model); } @Override @Transactional public PackageVersion[] getRPMS(String name) { RESTAssert.assertNotEmpty(name); ETemplate model = this.findByName(this.dtemplate, name); Set<PackageVersion> result = new HashSet<>(); for (EPackageVersion p : model.getPackageVersions()) { result.add(MAConverter.fromModel(p)); } return result.toArray(new PackageVersion[result.size()]); } @Override @Transactional public void addRPM(String name, PackageVersion rpm) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotNull(rpm); ETemplate model = this.findByName(this.dtemplate, name); this.assertModelFound(model); EPackageVersion erpm = null; if ((rpm.getVersion() == null) || rpm.getVersion().isEmpty()) { // get newest version List<EPackageVersion> rpms = this.drpm.find(rpm.getName()); Collections.sort(rpms, this.rpmComp); erpm = rpms.get(rpms.size() - 1); } else { // look for version erpm = this.drpm.find(rpm.getName(), rpm.getVersion()); } this.assertModelFound(erpm); boolean exists = false; for (EPackageVersion r : model.getPackageVersions()) { if (r.getPkg().getName().equals(erpm.getPkg().getName())) { if (r.getVersion().equals(erpm.getVersion())) { exists = true; } else { model.getPackageVersions().remove(r); } break; } } if (!exists) { model.getPackageVersions().add(erpm); this.dtemplate.save(model); } } @Override @Transactional public void removeRPM(String name, String pkg, String version) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotNull(pkg); RESTAssert.assertNotNull(version); ETemplate model = this.findByName(this.dtemplate, name); EPackageVersion erpm = this.drpm.find(pkg, version); this.assertModelFound(erpm); model.getPackageVersions().remove(erpm); model = this.dtemplate.save(model); for (EHost host : model.getHosts()) { for (EServiceState service : host.getServices()) { if (service.getService().getPackages().contains(erpm.getPkg())) { this.ddsst.delete(this.ddsst.findByName(service.getService().getName(), model.getName())); this.dsst.delete(service); } } } } @Override @Transactional public Service[] getServices(String name) { RESTAssert.assertNotEmpty(name); ETemplate model = this.findByName(this.dtemplate, name); List<EService> services = this.dsvc.findList(); Set<Service> result = new HashSet<>(); for (EService s : services) { for (EPackageVersion p : model.getPackageVersions()) { if (s.getPackages().contains(p.getPkg())) { result.add(MAConverter.fromModel(s)); } } } return result.toArray(new Service[result.size()]); } }