/* * OneCMDB, an open source configuration management project. * Copyright 2007, Lokomo Systems AB, and individual contributors * as indicated by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.onecmdb.core.tests.performance; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; public class GenerateHardware { int N_SYSTEMS_PER_SWITCH = 16; int N_SYSTEMS_PER_ROUTER = 16; List<CI> items = new ArrayList<CI>(); public static void main(String argv[]) { int servers = Integer.parseInt(argv[0]); int networks = Integer.parseInt(argv[1]); String file = null; if (argv.length > 2) { file = argv[2]; } new GenerateHardware().generate(file, servers, networks); } public void generate(String file, int servers, int networks) { int nServersPerNetwork = servers / networks; CIRouter root = new CIRouter("Internet", "ROOT"); new CINetwork("Internet"); for (int i = 0; i < networks; i++) { CIRouter r = getRouter("LAN-" + i, "NET-" + i +".ROOT", 0, nServersPerNetwork); root.addSystem(r); new CINetwork("LAN-" + i); } System.out.println(root.toString(0)); for (CI ci : items) { System.out.println(ci.toXML()); } if (file != null) { try { PrintWriter pWriter = new PrintWriter(file); pWriter.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); pWriter.println("<onecmdb>"); pWriter.println("<instances>"); for (CI ci : items) { pWriter.println(ci.toXML()); } pWriter.println("</instances>"); pWriter.println("</onecmdb>"); pWriter.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public CIRouter getRouter(String network, String path, int level, int servers) { level++; path = path + "." + level; CIRouter r = new CIRouter(network, path); int nSwitches = (servers + N_SYSTEMS_PER_SWITCH/2) / N_SYSTEMS_PER_SWITCH; int nRouters = nSwitches / N_SYSTEMS_PER_ROUTER; if (nRouters > 0 && !(servers <= N_SYSTEMS_PER_SWITCH * N_SYSTEMS_PER_ROUTER)) { int serverOffset = servers; for (int i = 0; i < (nRouters+1); i++) { int remainingServers = (serverOffset < (N_SYSTEMS_PER_SWITCH * N_SYSTEMS_PER_ROUTER)) ? serverOffset : (N_SYSTEMS_PER_SWITCH * N_SYSTEMS_PER_ROUTER); r.addSystem(getRouter(network, path, (level+1), remainingServers)); serverOffset -= (N_SYSTEMS_PER_SWITCH * N_SYSTEMS_PER_ROUTER); } } else { // Add all switches to the same router. int serverOffset = servers; for (int i = 0; i < nSwitches; i++) { int remainingServers = (serverOffset < N_SYSTEMS_PER_SWITCH) ? serverOffset : N_SYSTEMS_PER_SWITCH; r.addSystem(getSwitch(network, path + "-" + i, level+1, remainingServers)); serverOffset -= N_SYSTEMS_PER_SWITCH; } } return(r); } private CISwitch getSwitch(String network, String path, int level, int servers) { path = path + "." + level; CISwitch s = new CISwitch(network, path); for (int i = 0; i < servers; i++) { s.addSystem(new CIServer(network ,path + "." + i)); } return(s); } class CI { protected String name; public CI(String name) { this.name = name; items.add(this); } public StringBuffer toXML() { return(new StringBuffer()); } } class CINetwork extends CI { public CINetwork(String name) { super(name); } public StringBuffer toXML() { StringBuffer buffer = new StringBuffer(); buffer.append("\t<Network alias=\"" + name + "\">"); buffer.append("\n"); buffer.append("\t\t<A_Name>" + name +"</A_Name>"); buffer.append("\n"); buffer.append("\t</Network>"); return(buffer); } } class CISystem extends CI { protected String network; public CISystem(String network, String name) { super(name); this.network = network; } protected String getLevel(int level) { String pad = ""; for (int i = 0; i < level; i++) { pad += "\t"; } return(pad); } public StringBuffer toString(int level) { StringBuffer buffer = new StringBuffer(); buffer.append(getLevel(level) + name); return(buffer); } public String toString() { return(toString(0).toString()); } public String getName() { return(name); } } class CINetworkDevice extends CISystem { public CINetworkDevice(String network, String name) { super(network, name); } List<CISystem> systems = new ArrayList<CISystem>(); protected CINetworkDevice uplink; public void addSystem(CISystem system) { systems.add(system); if (system instanceof CINetworkDevice) { ((CINetworkDevice)system).setUplink(this); } } public void setUplink(CINetworkDevice device) { this.uplink = device; } public StringBuffer toString(int level) { StringBuffer buffer = new StringBuffer(); buffer.append(super.toString(level)); buffer.append("\n"); for (CISystem system : systems) { buffer.append(getLevel(level+1)); buffer.append(system.toString(level+1)); buffer.append("\n"); } return(buffer); } } class CIRouter extends CINetworkDevice { public CIRouter(String network, String name) { super(network, "Router-" + name); // TODO Auto-generated constructor stub } public StringBuffer toXML() { StringBuffer buffer = new StringBuffer(); buffer.append("\t<Router16Port alias=\"" + name + "\">"); buffer.append("\n"); buffer.append("\t\t<A_Name>" + name +"</A_Name>"); buffer.append("\n"); buffer.append("\t\t<BD_Network><ref alias=\"" + network + "\"/></BD_Network>"); buffer.append("\n"); if (uplink != null) { buffer.append("\t\t<X_Uplink><ref alias=\"" + uplink.getName() + "\"/></X_Uplink>"); buffer.append("\n"); } int port = 1; for (CISystem system : systems) { buffer.append("\t\t<P_Port" + port+ "><ref alias=\"" + system.getName() + "\"/></P_Port" + port + ">"); buffer.append("\n"); port++; } buffer.append("\t</Router16Port>"); return(buffer); } } class CISwitch extends CINetworkDevice { public CISwitch(String network, String name) { super(network, "Switch-" + name); // TODO Auto-generated constructor stub } public StringBuffer toXML() { StringBuffer buffer = new StringBuffer(); buffer.append("\t<Switch16Port alias=\"" + name + "\">"); buffer.append("\n"); buffer.append("\t\t<A_Name>" + name +"</A_Name>"); buffer.append("\n"); buffer.append("\t\t<BD_Network><ref alias=\"" + network + "\"/></BD_Network>"); buffer.append("\n"); if (uplink != null) { buffer.append("\t\t<X_Uplink><ref alias=\"" + uplink.getName() + "\"/></X_Uplink>"); buffer.append("\n"); } int port = 1; for (CISystem system : systems) { buffer.append("\t\t<P_Port" + port+ "><ref alias=\"" + system.getName() + "\"/></P_Port" + port + ">"); buffer.append("\n"); port++; } buffer.append("\t</Switch16Port>"); return(buffer); } } class CIServer extends CISystem { public CIServer(String network, String name) { super(network, "Server-" + name); } public StringBuffer toXML() { StringBuffer buffer = new StringBuffer(); buffer.append("\t<Server alias=\"" + name + "\">"); buffer.append("\n"); buffer.append("\t\t<A_Name>" + name +"</A_Name>"); buffer.append("\n"); buffer.append("\t\t<BD_Network><ref alias=\"" + network + "\"/></BD_Network>"); buffer.append("\n"); buffer.append("\t</Server>"); return(buffer); } } }