Project: CloudReports
/* 
 * Copyright (c) 2010-2012 Thiago T. Sá 
 *  
 * This file is part of CloudReports. 
 * 
 * CloudReports is free software: you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 *  
 * CloudReports is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * For more information about your rights as a user of CloudReports, 
 * refer to the LICENSE file or see <http://www.gnu.org/licenses/>. 
 */
 
package cloudreports.models; 
 
import java.io.Serializable; 
import java.util.LinkedList; 
import java.util.List; 
 
/**
 * A datacenter registry stores information about a specific datacenter. 
 * It contains the list of hosts owned by the datacenter, cost values and  
 * other general specifications. 
 *  
 * @author      Thiago T. Sá 
 * @since       1.0 
 */
 
public class DatacenterRegistry implements Serializable{ 
 
    /** The datacenter's id. */ 
    private long id; 
     
    /** The datacenter's name. */ 
    private String name; 
     
    /** The datacenter's architecture. */ 
    private String architecture; 
     
    /** The datacenter's operating system. */ 
    private String os; 
     
    /** The datacenter's hypervisor. */ 
    private String vmm; 
     
    /** The datacenter's time zone. */ 
    private double timeZone; 
     
    /** The alias of the datacenter's allocation policy. */ 
    private String allocationPolicyAlias; 
     
    /** Indicates whether virtual machines migrations are enabled or not. */ 
    private boolean vmMigration; 
     
    /** The list of hosts owned by the datacenter. */ 
    private List<HostRegistry> hostList; 
     
    /** The cost by second of processing. */ 
    private double costPerSec; 
     
    /** The cost by RAM usage. */ 
    private double costPerMem; 
     
    /** The cost by storage usage. */ 
    private double costPerStorage; 
     
    /** The cost by bandwidth usage. */ 
    private double costPerBw; 
     
    /** The list of SAN owned by the datacenter. */ 
    private List<SanStorageRegistry> sanList; 
     
    /** The upper utilization threshold of the datacenter. */ 
    private double upperUtilizationThreshold; 
     
    /** The lower utilization threshold of the datacenter. */ 
    private double lowerUtilizationThreshold; 
     
    /** The datacenter's scheduling interval. */ 
    private double schedulingInterval; 
     
    /** The datacenter's monitoring interval. */ 
    private double monitoringInterval; 
 
    /** The default constructor. */ 
    public DatacenterRegistry() {} 
     
    /** 
     * Creates a new datacenter registry with the given name.  
     *  
     * @param   name    the name of the datacenter registry. 
     * @since           1.0 
     */
     
    public DatacenterRegistry(String name) { 
        setName(name); 
        setArchitecture("x86"); 
        setOs("Linux"); 
        setVmm("Xen"); 
        setTimeZone(-3.0); 
        setAllocationPolicyAlias("Single threshold"); 
        setVmMigration(true); 
        setCostPerSec(0.1); 
        setCostPerMem(0.05); 
        setCostPerStorage(0.001); 
        setCostPerBw(0.1); 
        setUpperUtilizationThreshold(0.8); 
        setLowerUtilizationThreshold(0.2); 
        setSchedulingInterval(30); 
        setMonitoringInterval(180); 
         
        //Create host list 
        setHostList(new LinkedList<HostRegistry>()); 
        getHostList().add(new HostRegistry()); 
         
        //Create SAN Storage List 
        setSanList(new LinkedList<SanStorageRegistry>()); 
        getSanList().add(new SanStorageRegistry("SAN1")); 
    }     
 
    /**
     * Gets the datacenter's id. 
     *  
     * @return the datacenter's id. 
     */
 
    public long getId() { 
        return id; 
    } 
 
    /**
     * Sets the datacenter's id. 
     *  
     * @param   id  the datacenter's id. 
     */
 
    public void setId(long id) { 
        this.id = id; 
    } 
 
    /**
     * Gets the datacenter's name. 
     *  
     * @return the datacenter's name. 
     */
 
    public String getName() { 
        return name; 
    } 
 
    /**
     * Sets the datacenter's name. 
     *  
     * @param   name    the datacenter's name. 
     */
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    /**
     * Gets the datacenter's architecture. 
     *  
     * @return the datacenter's architecture. 
     */
 
    public String getArchitecture() { 
        return architecture; 
    } 
 
    /**
     * Sets the datacenter's architecture. 
     *  
     * @param   architecture    the datacenter's architecture. 
     */
 
    public void setArchitecture(String architecture) { 
        this.architecture = architecture; 
    } 
 
    /**
     * Gets the datacenter's operating system. 
     *  
     * @return the datacenter's operating system. 
     */
 
    public String getOs() { 
        return os; 
    } 
 
    /**
     * Sets the datacenter's operating system. 
     *  
     * @param   os  the datacenter's operating system. 
     */
 
    public void setOs(String os) { 
        this.os = os; 
    } 
 
    /**
     * Gets the datacenter's hypervisor. 
     *  
     * @return the datacenter's hypervisor. 
     */
 
    public String getVmm() { 
        return vmm; 
    } 
 
    /**
     * Sets the datacenter's hypervisor. 
     *  
     * @param   vmm the datacenter's hypervisor. 
     */
 
    public void setVmm(String vmm) { 
        this.vmm = vmm; 
    } 
 
    /**
     * Gets the datacenter's time zone. 
     *  
     * @return the datacenter's time zone. 
     */
 
    public double getTimeZone() { 
        return timeZone; 
    } 
 
    /**
     * Sets the datacenter's time zone. 
     *  
     * @param   timeZone    the datacenter's time zone. 
     */
 
    public void setTimeZone(double timeZone) { 
        this.timeZone = timeZone; 
    } 
 
    /**
     * Gets the datacenter's allocation policy. 
     *  
     * @return the datacenter's allocation policy. 
     */
 
    public String getAllocationPolicyAlias() { 
        return allocationPolicyAlias; 
    } 
 
    /**
     * Sets the datacenter's allocation policy. 
     *  
     * @param   allocationPolicyAlias   the datacenter's allocation policy. 
     */
 
    public void setAllocationPolicyAlias(String allocationPolicyAlias) { 
        this.allocationPolicyAlias = allocationPolicyAlias; 
    } 
 
    /**
     * Checks if virtual machines migrations are enabled. 
     *  
     * @return  <code>true</code> if virtual machines migrations are enabled; 
     *          <code>false</code> otherwise. 
     */
 
    public boolean isVmMigration() { 
        return vmMigration; 
    } 
 
    /**
     * Enables/disables virtual machines migrations. 
     *  
     * @param   vmMigration indicates if virtual machines migrations are enabled 
     *                      or not 
     */
 
    public void setVmMigration(boolean vmMigration) { 
        this.vmMigration = vmMigration; 
    } 
 
    /**
     * Gets the datacenter's hosts list. 
     *  
     * @return the datacenter's host list. 
     */
 
    public List<HostRegistry> getHostList() { 
        return hostList; 
    } 
 
    /**
     * Sets the datacenter's hosts list. 
     *  
     * @param   hostList    the datacenter's host list. 
     */
 
    public void setHostList(List<HostRegistry> hostList) { 
        this.hostList = hostList; 
    } 
 
    /**
     * Gets the datacenter's cost by second of processing. 
     *  
     * @return the datacenter's cost by second of processing. 
     */
 
    public double getCostPerSec() { 
        return costPerSec; 
    } 
 
    /**
     * Sets the datacenter's cost by second of processing. 
     *  
     * @param   costPerSec  the datacenter's cost by second of processing. 
     */
 
    public void setCostPerSec(double costPerSec) { 
        this.costPerSec = costPerSec; 
    } 
 
    /**
     * Gets the datacenter's cost by RAM usage. 
     *  
     * @return the datacenter's cost by RAM usage. 
     */
 
    public double getCostPerMem() { 
        return costPerMem; 
    } 
 
    /**
     * Sets the datacenter's cost by RAM usage. 
     *  
     * @param   costPerMem  the datacenter's cost by RAM usage. 
     */
 
    public void setCostPerMem(double costPerMem) { 
        this.costPerMem = costPerMem; 
    } 
 
    /**
     * Gets the datacenter's cost by storage usage. 
     *  
     * @return the datacenter's cost by storage usage. 
     */
 
    public double getCostPerStorage() { 
        return costPerStorage; 
    } 
 
    /**
     * Sets the datacenter's cost by storage usage. 
     *  
     * @param   costPerStorage  the datacenter's cost by storage usage. 
     */
 
    public void setCostPerStorage(double costPerStorage) { 
        this.costPerStorage = costPerStorage; 
    } 
 
    /**
     * Gets the datacenter's cost by bandwidth usage. 
     *  
     * @return the datacenter's cost by bandwidth usage. 
     */
 
    public double getCostPerBw() { 
        return costPerBw; 
    } 
 
    /**
     * Sets the datacenter's cost by bandwidth usage. 
     *  
     * @param   costPerBw   the datacenter's cost by bandwidth usage. 
     */
 
    public void setCostPerBw(double costPerBw) { 
        this.costPerBw = costPerBw; 
    } 
 
    /**
     * Gets the datacenter's SAN list. 
     *  
     * @return the datacenter's SAN list. 
     */
 
    public List<SanStorageRegistry> getSanList() { 
        return sanList; 
    } 
 
    /**
     * Sets the datacenter's SAN list. 
     *  
     * @param   sanList the datacenter's SAN list. 
     */
 
    public void setSanList(List<SanStorageRegistry> sanList) { 
        this.sanList = sanList; 
    } 
 
    /**
     * Gets the datacenter's scheduling interval. 
     *  
     * @return the datacenter's scheduling interval. 
     */
 
    public double getSchedulingInterval() { 
        return schedulingInterval; 
    } 
 
    /**
     * Sets the datacenter's scheduling interval. 
     *  
     * @param   schedulingInterval  the datacenter's scheduling interval. 
     */
 
    public void setSchedulingInterval(double schedulingInterval) { 
        this.schedulingInterval = schedulingInterval; 
    } 
     
    /**
     * Gets the datacenter's upper utilization threshold. 
     *  
     * @return the datacenter's upper utilization threshold. 
     */
 
    public double getUpperUtilizationThreshold() { 
        return upperUtilizationThreshold; 
    } 
 
    /**
     * Sets the datacenter's upper utilization threshold. 
     *  
     * @param   upperUtilizationThreshold   the datacenter's upper utilization 
     *                                      threshold. 
     */
 
    public void setUpperUtilizationThreshold(double upperUtilizationThreshold) { 
        this.upperUtilizationThreshold = upperUtilizationThreshold; 
    } 
 
    /**
     * Gets the datacenter's lower utilization threshold. 
     *  
     * @return the datacenter's lower utilization threshold. 
     */
 
    public double getLowerUtilizationThreshold() { 
        return lowerUtilizationThreshold; 
    } 
 
    /**
     * Sets the datacenter's lower utilization threshold. 
     *  
     * @param lowerUtilizationThreshold the datacenter's lower utilization 
     *                                  threshold. 
     */
 
    public void setLowerUtilizationThreshold(double lowerUtilizationThreshold) { 
        this.lowerUtilizationThreshold = lowerUtilizationThreshold; 
    } 
 
    /**
     * Gets the datacenter's monitoring interval. 
     *  
     * @return the datacenter's monitoring interval. 
     */
 
    public double getMonitoringInterval() { 
        return monitoringInterval; 
    } 
 
    /**
     * Sets the datacenter's monitoring interval. 
     *  
     * @param   monitoringInterval  the datacenter's monitoring interval. 
     */
 
    public void setMonitoringInterval(double monitoringInterval) { 
        this.monitoringInterval = monitoringInterval; 
    } 
     
    @Override 
    public boolean equals(Object datacenter){ 
      if ( this == datacenter ) return true
      if ( !(datacenter instanceof DatacenterRegistry) ) return false
      DatacenterRegistry dr = (DatacenterRegistry)datacenter; 
      return this.getName().equals(dr.getName()); 
    } 
 
    @Override 
    public int hashCode() { 
        int hash = 3
        hash = 79 * hash + (this.getName() != null ? this.getName().hashCode() : 0); 
        return hash; 
    } 
     
    @Override 
    public String toString() { 
        StringBuilder s = new StringBuilder("Name="+getName()+"\n"); 
        s.append("Architecture="+getArchitecture()+"\n"); 
        s.append("Operating System="+getOs()+"\n"); 
        s.append("Hypervisor="+getVmm()+"\n"); 
        s.append("Allocation Policy ID="+ getAllocationPolicyAlias()+"\n"); 
        s.append("Time Zone (GMT)="+getTimeZone()+"\n"); 
        s.append("VM Migrations="+isVmMigration()+"\n"); 
        s.append("Upper Utilization threshold="+getUpperUtilizationThreshold()+"\n"); 
        s.append("Lower Utilization threshold="+getLowerUtilizationThreshold()+"\n"); 
        s.append("Scheduling interval="+getSchedulingInterval()+"\n"); 
        s.append("Processing Cost="+getCostPerSec()+"\n"); 
        s.append("Memory Cost="+getCostPerMem()+"\n"); 
        s.append("Storage Cost="+getCostPerStorage()+"\n"); 
        s.append("Bandwidth Cost="+getCostPerBw()+"\n"); 
 
        s.append("\n++Beginning of hosts list++\n"); 
        for(HostRegistry hr : getHostList()) { 
            s.append("\n"+hr.toString()); 
        } 
        s.append("\n++End of hosts list++\n"); 
 
        s.append("\n++Beginning of SAN list++\n"); 
        for(SanStorageRegistry sr : getSanList()) { 
            s.append("\n"+sr.toString()); 
        } 
        s.append("\n++End of SAN list++\n"); 
 
        return s.toString(); 
    } 
 
}