2017-03-03 19:10:02 +01:00
|
|
|
package org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
***REMOVED***
|
2017-04-26 17:39:24 +02:00
|
|
|
import java.io.InputStream;
|
2017-03-03 19:10:02 +01:00
|
|
|
import java.io.PrintStream;
|
|
|
|
import java.util.Collection;
|
|
|
|
***REMOVED***
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
|
|
|
import java.util.TreeMap;
|
|
|
|
import java.util.TreeSet;
|
|
|
|
import java.util.UUID;
|
|
|
|
import java.util.Vector;
|
|
|
|
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.AnsibleWorker;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.AnsibleHost;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Inventory;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Playbook;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Role;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.AlgorithmPackage;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.CranDependencyPackage;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.CustomDependencyPackage;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.CustomRoleManager;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.OSDependencyPackage;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.StaticRoleManager;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.template.TemplateManager;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.Algorithm;
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.AlgorithmSet;
|
|
|
|
***REMOVED***
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.Dependency;
|
|
|
|
***REMOVED***
|
|
|
|
import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.comparator.HostComparator;
|
|
|
|
***REMOVED***
|
2017-04-22 19:24:33 +02:00
|
|
|
import org.tmatesoft.svn.core.SVNException;
|
2017-03-03 19:10:02 +01:00
|
|
|
|
|
|
|
public class AnsibleBridge {
|
|
|
|
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(AnsibleBridge.class);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The workdir for this service
|
|
|
|
*/
|
|
|
|
private String dpmRoot;
|
|
|
|
|
|
|
|
public AnsibleBridge() {
|
2017-04-26 17:39:24 +02:00
|
|
|
this(System.getProperty("user.home")+File.separator+"dataminer-pool-manager");
|
2017-04-03 14:35:03 +02:00
|
|
|
***REMOVED***this(System.getProperty("/home/gcube/dataminer-pool-manager"));
|
|
|
|
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
public AnsibleBridge(String root) {
|
|
|
|
this.dpmRoot = root;
|
|
|
|
this.ensureServiceRoot();
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
private void ensureServiceRoot() {
|
|
|
|
***REMOVED*** generate root
|
|
|
|
new File(dpmRoot).mkdirs();
|
|
|
|
***REMOVED*** 'template' is for template roles
|
2017-04-26 17:39:24 +02:00
|
|
|
***REMOVED***this.getTemplatesDir().mkdirs();
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED*** 'static' is for custom roles
|
2017-04-26 17:39:24 +02:00
|
|
|
***REMOVED***this.getCustomDir().mkdirs();
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED*** 'work' is for temporary working directories
|
|
|
|
this.getWorkDir().mkdirs();
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
private File getWorkDir() {
|
|
|
|
return new File(this.dpmRoot, "work");
|
|
|
|
***REMOVED***
|
|
|
|
|
2017-04-26 17:39:24 +02:00
|
|
|
***REMOVED*** private String getTemplatesDir() {
|
|
|
|
***REMOVED*** String input = null;
|
|
|
|
***REMOVED*** input = AnsibleBridge.class.getClassLoader().getResource("templates").getPath();
|
|
|
|
***REMOVED*** return input;
|
|
|
|
***REMOVED*** ***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED*** private String getCustomDir() {
|
|
|
|
***REMOVED*** String input = null;
|
|
|
|
***REMOVED*** input = AnsibleBridge.class.getClassLoader().getResource("custom").getPath();
|
|
|
|
***REMOVED*** return input;
|
|
|
|
***REMOVED*** ***REMOVED***
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-03 19:10:02 +01:00
|
|
|
|
|
|
|
|
2017-05-09 18:38:15 +02:00
|
|
|
public AnsibleWorker createWorker(Algorithm algorithm, Cluster dataminerCluster, boolean includeAlgorithmDependencies, String user) throws IOException {
|
2017-03-03 19:10:02 +01:00
|
|
|
File workerRoot = new File(this.getWorkDir(), UUID.randomUUID().toString());
|
|
|
|
AnsibleWorker worker = new AnsibleWorker(workerRoot);
|
2017-05-09 18:38:15 +02:00
|
|
|
|
|
|
|
List<Role> algoRoles = new Vector<>();
|
|
|
|
|
|
|
|
***REMOVED*** add algorithms and dependencies to the worker
|
|
|
|
for (Role r : this.generateRoles(algorithm)) {
|
|
|
|
algoRoles.add(r);
|
|
|
|
worker.addRole(r);
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED***to comment the for in case of just install algo
|
|
|
|
if(includeAlgorithmDependencies){
|
|
|
|
for (Dependency d : algorithm.getDependencies()) {
|
|
|
|
for (Role r : this.generateRoles(d)) {
|
|
|
|
worker.addRole(r);
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
|
|
|
|
***REMOVED*** add static roles
|
|
|
|
for(Role r:this.getStaticRoleManager().getStaticRoles()) {
|
|
|
|
worker.addRole(r);
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED*** generate the inventory
|
|
|
|
Inventory inventory = new Inventory();
|
|
|
|
for (Host h : dataminerCluster.getHosts()) {
|
|
|
|
AnsibleHost ah = new AnsibleHost(h.getName());
|
|
|
|
inventory.addHost(ah, "universe");
|
|
|
|
inventory.addHost(ah, "d4science");
|
|
|
|
***REMOVED***
|
|
|
|
worker.setInventory(inventory);
|
|
|
|
|
|
|
|
***REMOVED*** generate the playbook
|
|
|
|
Playbook playbook = new Playbook();
|
|
|
|
playbook.setRemote_user(user);
|
|
|
|
playbook.applyTo("universe");
|
|
|
|
for(Role r:algoRoles) {
|
|
|
|
***REMOVED*** add only 'add' roles
|
|
|
|
if(!r.getName().endsWith("remove")) {
|
|
|
|
playbook.addRole(r.getName());
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
worker.setPlaybook(playbook);
|
|
|
|
|
2017-03-03 19:10:02 +01:00
|
|
|
return worker;
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Groups hosts by domain and algorithm sets
|
|
|
|
* @param clusters
|
|
|
|
*/
|
|
|
|
public void printInventoryByDomainAndSets(Collection<Cluster> clusters) {
|
|
|
|
Map<String, Set<Host>> inventory = new TreeMap<>();
|
|
|
|
for(Cluster cluster:clusters) {
|
|
|
|
for(AlgorithmSet as:cluster.getAlgorithmSets()) {
|
|
|
|
String asName = as.getName();
|
|
|
|
for(Host h:cluster.getHosts()) {
|
|
|
|
String domain = h.getDomain().getName();
|
|
|
|
String key = String.format("[%s@%s]", asName, domain);
|
|
|
|
Set<Host> hosts = inventory.get(key);
|
|
|
|
if(hosts==null) {
|
|
|
|
hosts = new TreeSet<>(new HostComparator());
|
|
|
|
inventory.put(key, hosts);
|
|
|
|
***REMOVED***
|
|
|
|
hosts.add(h);
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
for(String key:inventory.keySet()) {
|
|
|
|
System.out.println(key);
|
|
|
|
Collection<Host> hosts = inventory.get(key);
|
|
|
|
for(Host h:hosts) {
|
|
|
|
System.out.println(h.getName()+"."+h.getDomain().getName());
|
|
|
|
***REMOVED***
|
|
|
|
System.out.println();
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Groups hosts by algorithm sets only
|
|
|
|
* @param clusters
|
|
|
|
*/
|
|
|
|
public void printInventoryBySets(Collection<Cluster> clusters) {
|
|
|
|
Map<String, Set<Host>> inventory = new TreeMap<>();
|
|
|
|
for (Cluster cluster : clusters) {
|
|
|
|
for (AlgorithmSet as : cluster.getAlgorithmSets()) {
|
|
|
|
String asName = as.getName();
|
|
|
|
for (Host h : cluster.getHosts()) {
|
|
|
|
String key = String.format("[%s]", asName);
|
|
|
|
Set<Host> hosts = inventory.get(key);
|
|
|
|
if (hosts == null) {
|
|
|
|
hosts = new TreeSet<>(new HostComparator());
|
|
|
|
inventory.put(key, hosts);
|
|
|
|
***REMOVED***
|
|
|
|
hosts.add(h);
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
for (String key : inventory.keySet()) {
|
|
|
|
System.out.println(key);
|
|
|
|
Collection<Host> hosts = inventory.get(key);
|
|
|
|
for (Host h : hosts) {
|
|
|
|
System.out.println(h.getName()+"."+h.getDomain().getName());
|
|
|
|
***REMOVED***
|
|
|
|
System.out.println();
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
|
2017-05-09 17:10:03 +02:00
|
|
|
public AnsibleWorker applyAlgorithmSetToCluster(AlgorithmSet as, Cluster cluster, /*boolean updateSVN,*/ boolean test) throws IOException, InterruptedException, SVNException {
|
2017-03-03 19:10:02 +01:00
|
|
|
|
|
|
|
|
2017-05-09 17:10:03 +02:00
|
|
|
return applyAlgorithmSetToCluster (as,cluster,UUID.randomUUID().toString(),/*updateSVN,*/ test);
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***
|
|
|
|
|
2017-05-09 17:10:03 +02:00
|
|
|
public AnsibleWorker applyAlgorithmSetToCluster(AlgorithmSet as, Cluster cluster,String uuid, /*boolean updateSVN,*/ boolean test) throws IOException, InterruptedException, SVNException {
|
2017-03-03 19:10:02 +01:00
|
|
|
AnsibleWorker worker = new AnsibleWorker(new File(this.getWorkDir(), uuid));
|
|
|
|
|
|
|
|
|
|
|
|
List<Role> algoRoles = new Vector<>();
|
|
|
|
|
|
|
|
***REMOVED*** add algorithms and dependencies to the worker
|
|
|
|
for (Algorithm a : as.getAlgorithms()) {
|
|
|
|
for (Role r : this.generateRoles(a)) {
|
|
|
|
algoRoles.add(r);
|
|
|
|
worker.addRole(r);
|
|
|
|
***REMOVED***
|
2017-05-09 17:10:03 +02:00
|
|
|
***REMOVED***to comment the for in case of just install algo
|
|
|
|
if(test){
|
2017-03-03 19:10:02 +01:00
|
|
|
for (Dependency d : a.getDependencies()) {
|
|
|
|
for (Role r : this.generateRoles(d)) {
|
|
|
|
worker.addRole(r);
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
2017-05-09 17:10:03 +02:00
|
|
|
***REMOVED***
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED*** add static roles
|
|
|
|
for(Role r:this.getStaticRoleManager().getStaticRoles()) {
|
|
|
|
worker.addRole(r);
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED*** generate the inventory
|
|
|
|
Inventory inventory = new Inventory();
|
|
|
|
for (Host h : cluster.getHosts()) {
|
|
|
|
AnsibleHost ah = new AnsibleHost(h.getName());
|
|
|
|
inventory.addHost(ah, "universe");
|
|
|
|
inventory.addHost(ah, "d4science");
|
|
|
|
***REMOVED***
|
|
|
|
worker.setInventory(inventory);
|
|
|
|
|
|
|
|
***REMOVED*** generate the playbook
|
|
|
|
Playbook playbook = new Playbook();
|
2017-05-09 17:10:03 +02:00
|
|
|
if(test){
|
|
|
|
playbook.setRemote_user("root");***REMOVED***
|
|
|
|
playbook.setRemote_user("gcube");
|
2017-03-03 19:10:02 +01:00
|
|
|
playbook.applyTo("universe");
|
|
|
|
for(Role r:algoRoles) {
|
|
|
|
***REMOVED*** add only 'add' roles
|
|
|
|
if(!r.getName().endsWith("remove")) {
|
|
|
|
playbook.addRole(r.getName());
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
worker.setPlaybook(playbook);
|
|
|
|
|
|
|
|
***REMOVED*** execute and save log locally
|
2017-04-03 14:35:03 +02:00
|
|
|
***REMOVED***PrintStream console = System.out;
|
2017-03-03 19:10:02 +01:00
|
|
|
File path = new File(worker.getWorkdir() + File.separator + "logs");
|
|
|
|
path.mkdirs();
|
|
|
|
File n = new File(path + File.separator + worker.getWorkerId());
|
|
|
|
FileOutputStream fos = new FileOutputStream(n);
|
|
|
|
PrintStream ps = new PrintStream(fos);
|
2017-04-03 14:35:03 +02:00
|
|
|
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***System.setErr(console);
|
|
|
|
|
2017-05-09 17:10:03 +02:00
|
|
|
worker.apply(as,ps,test);
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***System.setOut(console);
|
|
|
|
***REMOVED***worker.apply();
|
|
|
|
System.out.println("Log stored to to " + n.getAbsolutePath());
|
|
|
|
|
|
|
|
***REMOVED*** destroy the worker
|
|
|
|
worker.destroy();
|
|
|
|
return worker;
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private TemplateManager getTemplateManager() {
|
2017-04-26 17:39:24 +02:00
|
|
|
return new TemplateManager();
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
private CustomRoleManager getCustomRoleManager() {
|
2017-04-26 17:39:24 +02:00
|
|
|
return new CustomRoleManager();
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
private StaticRoleManager getStaticRoleManager() {
|
2017-04-26 17:39:24 +02:00
|
|
|
return new StaticRoleManager();
|
2017-03-03 19:10:02 +01:00
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generate all roles for this dependency
|
|
|
|
* @param d
|
|
|
|
*/
|
|
|
|
public Collection<Role> generateRoles(Dependency d) {
|
|
|
|
Collection<Role> roles = new Vector<>();
|
|
|
|
|
|
|
|
|
|
|
|
if("os".equalsIgnoreCase(d.getType())) {
|
|
|
|
OSDependencyPackage pkg = new OSDependencyPackage(d);
|
|
|
|
if(pkg!=null) {
|
|
|
|
roles.addAll(pkg.getRoles(this.getTemplateManager()));
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED*** else if("custom".equalsIgnoreCase(d.getType())) {
|
|
|
|
CustomDependencyPackage pkg = new CustomDependencyPackage(d);
|
|
|
|
if(pkg!=null) {
|
|
|
|
roles.addAll(pkg.getRoles(this.getCustomRoleManager()));
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
else if("github".equalsIgnoreCase(d.getType())) {
|
|
|
|
CranDependencyPackage pkg = new CranDependencyPackage(d);
|
|
|
|
if(pkg!=null) {
|
|
|
|
roles.addAll(pkg.getRoles(this.getTemplateManager()));
|
|
|
|
***REMOVED***
|
|
|
|
***REMOVED***
|
|
|
|
else if("cran".equalsIgnoreCase(d.getType())) {
|
|
|
|
CranDependencyPackage pkg = new CranDependencyPackage(d);
|
|
|
|
if(pkg!=null) {
|
|
|
|
roles.addAll(pkg.getRoles(this.getTemplateManager()));
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
|
|
|
|
***REMOVED***
|
|
|
|
return roles;
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
public Collection<Role> generateRoles(Algorithm a) {
|
|
|
|
AlgorithmPackage pkg = new AlgorithmPackage(a);
|
|
|
|
return pkg.getRoles(this.getTemplateManager());
|
|
|
|
***REMOVED***
|
|
|
|
|
|
|
|
***REMOVED***
|