openstack的topo图

http://haoningabc.iteye.com/blog/2317951装完openstack
http://haoningabc.iteye.com/blog/2322169做完neutron的试验
复杂的网络关系还是无法获取,
做个topo图

写个脚本查看nova和neutron的表的结构
mysql_openstack.sh:
#!/bin/sh    
#for i  in `awk ' {if(NR>4 && NR<40)print $2};' a.log `    
  
mysql_user=root  
mysql_password=haoning  
mysql_host=mcon  
  
if [ "$1" =  "" ]  
then  
        echo "please use ./mysql_openstack.sh [dbname],  for example: ./mysql_openstack.sh keystone";  
        echo "this will exit."    
        exit 0;  
fi  
  
echo "use db " $1    
  
for i  in ` mysql -u$mysql_user -h$mysql_host -p$mysql_password  $1  -e "show tables" |awk ' {if(NR>1)print $1};'`  
do  
        if [ $i != "ml2_vxlan_allocations" ]  
        then  
                echo "mysql -u$mysql_user -h$mysql_host -p$mysql_password $1 -e \"select * from \`$i\`\"";  
                mysql -u$mysql_user -h$mysql_host -p$mysql_password $1 -e "select * from \`$i\`";  
        fi  
done  

./mysql_openstack.sh neutron
./mysql_openstack.sh nova

观察得到 nova库的instance
neutron库的,networks,routers,subnets,ports
这几个表看明白就理解neutron的基础概念了
网络,子网,路由器,端口

其实就是linux的
brctl show
ip netns
bridge fdb
ip neigh

veth pair,tap,桥,vxlan
等概念的组合
如果使用openstack命令
nova list
neutron net-list
neutron subnet-list
neutron router-list
neutron port-list


简单写个java的demo,
生成固定格式的json,
传给noflo显示成topo图
package openstacktopo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

//import net.sf.json.JSONObject;
//https://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/
public class Topo {
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Connection getConnection(String db) {
		String url = "jdbc:mysql://192.168.139.251:3306/"+db;
		String username = "root";
		String password = "haoning";
		Connection con = null;
		try {
			con = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
	public  Map getInstances() {//获取实例
		Map vm_processes=new HashMap();
		ResultSet rs = null;
		Connection con = null;
		try {
			con = getConnection("nova");
			PreparedStatement ps = null;
			String sql = "select i.uuid,i.display_name,i.launched_on,i.vm_state from  instances i where  deleted =0 ";
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {	
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					JSONObject instance=new JSONObject();
					JSONObject metadata=new JSONObject();
					//System.out.println(rs.getString("uuid")+"\t");
					//System.out.println(rs.getString("display_name")+"\t");
					instance.put("component", "vm/"+rs.getString("uuid"));
					metadata.put("type", "vm");
					metadata.put("vm_id", rs.getString("uuid"));
					metadata.put("vm_status", rs.getString("vm_state"));
					metadata.put("label", rs.getString("display_name"));
					instance.put("metadata", metadata);
					//System.out.println(instance);
					vm_processes.put("vm/"+rs.getString("uuid"), instance);
				}
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		return vm_processes;
	}
	public  List<JSONObject> get_instance_net() {//获取vm和网络的关系
		List list_i_net=new ArrayList();
		ResultSet rs = null;
		Connection con = null;
		try {
			con = getConnection("nova");
			PreparedStatement ps = null;
			String sql = "select iic.network_info,i.uuid,i.display_name,i.launched_on from instance_info_caches iic ,  instances i where i.id=iic.id and  i.deleted = 0";
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					//System.out.println(rs.getString("uuid")+"\t");//vm-id
					//System.out.println(rs.getString("display_name")+"\t");//vm-name
					String network_info = rs.getString("network_info");
					//System.out.println(rs.getString("network_info"));
					JSONArray ja = new JSONArray().fromObject(network_info);
					for(int i=0;i<ja.size();i++){
						JSONObject jo= (JSONObject) ja.get(i);
						//System.out.println(jo.get("id"));//port-id ★★★★★
						JSONObject network= (JSONObject) jo.get("network");
						//System.out.println("---------");
						//System.out.println(((JSONObject)((JSONArray)((JSONObject)((JSONArray)(network.get("subnets"))).get(0)).get("ips")).get(0)).get("address"));
						//System.out.println(((JSONObject)(((JSONObject)((JSONArray)(network.get("subnets"))).get(0)).get("meta"))).get("dhcp_server"));
						String dhcp_server = (String) ((JSONObject)(((JSONObject)((JSONArray)(network.get("subnets"))).get(0)).get("meta"))).get("dhcp_server");
						String vm_address = (String) ((JSONObject)((JSONArray)((JSONObject)((JSONArray)(network.get("subnets"))).get(0)).get("ips")).get(0)).get("address");
						//System.out.println(network.get("id"));//network-id
						//System.out.println(network.get("label"));//network-name
						//System.out.println(network);
						JSONObject one_connection=new JSONObject();
						one_connection.put("src", new JSONObject().fromObject("{\"process\":\"switch/"+network.get("id")+"\",\"port\":\""+dhcp_server+"\"}"));//有port
						one_connection.put("tgt", new JSONObject().fromObject("{\"process\":\"vm/"+rs.getString("uuid")+"\",\"port\":\""+vm_address+"\"}"));
					//	System.out.println(one_connection);
						list_i_net.add(one_connection);
					}
					//System.out.println();
				}
				
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		return list_i_net;
	}
	public  List<JSONObject> get_router_net() {//获取router和网络的关系
		List list_router_net=new ArrayList();
		ResultSet rs = null;
		Connection con = null;
		try {
			con = getConnection("neutron");
			PreparedStatement ps = null;
			String sql = "select * from routerports rp ,ports p,ipallocations i where rp.port_id=p.id and i.port_id=p.id";
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					JSONObject one_connection=new JSONObject();
					String ip_address = rs.getString("ip_address");
					if("network:router_interface".equals(rs.getString("port_type"))){
						one_connection.put("src", new JSONObject().fromObject("{\"process\":\"router/"+rs.getString("router_id")+"\",\"port\":\""+ip_address+"\"}"));
						one_connection.put("tgt", new JSONObject().fromObject("{\"process\":\"switch/"+rs.getString("network_id")+"\",\"port\":\""+"in"+"\"}"));
										
					}else{//network:router_gateway
						//one_connection.put("src", new JSONObject().fromObject("{\"process\":\"router/"+rs.getString("router_id")+"\",\"port\":\""+jo.get("port_id")+"\"}"));
						one_connection.put("src", new JSONObject().fromObject("{\"process\":\"switch/"+rs.getString("network_id")+"\",\"port\":\""+"out"+"\"}"));
						one_connection.put("tgt", new JSONObject().fromObject("{\"process\":\"router/"+rs.getString("router_id")+"\",\"port\":\""+ip_address+"\"}"));	
					}
					//System.out.println(one_connection);
					list_router_net.add(one_connection);
						
					//System.out.println();
				}
				
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		return list_router_net;
	}
	public  Map<String,JSONObject> getRouters() {
		Map<String,JSONObject>  routers=new HashMap<String,JSONObject>();
		Connection con = null;
		ResultSet rs = null;
		try {
			con = getConnection("neutron");
			PreparedStatement ps = null;
			String sql = "select * from routers";
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					JSONObject instance=new JSONObject();
					JSONObject metadata=new JSONObject();
					instance.put("component", "router/"+rs.getString("id"));
					metadata.put("type", "router");
					metadata.put("router_id", rs.getString("id"));
					metadata.put("router_status", rs.getString("status"));
					metadata.put("label", rs.getString("name"));
					instance.put("metadata", metadata);
					//System.out.println(instance);
					routers.put("router/"+rs.getString("id"), instance);
				}
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		return routers;
	}
	public  Map getNetworkExternal() {//获取网络是外部网络的集合
		Map external_map = new HashMap();
		Connection con = null;
		ResultSet rs = null;
		try {
			con = getConnection("neutron");
			PreparedStatement ps = null;
			String sql = "select * from networkrbacs where action='access_as_external'";//where tenant_id= scsssdfs;
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					external_map.put(rs.getString("object_id"),"access_as_external");
				}
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		//System.out.println(external_map.size());
		return external_map;
	}
	public  Map getNetworkShared() {//获取网络是共享网络的集合
		Map shared_map = new HashMap();
		Connection con = null;
		ResultSet rs = null;
		try {
			con = getConnection("neutron");
			PreparedStatement ps = null;
			String sql = "select * from networkrbacs where action='access_as_shared'";//where tenant_id= scsssdfs;
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					shared_map.put(rs.getString("object_id"), "access_as_shared");
				}
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		//System.out.println(shared_map.size());
		return shared_map;
	}
	public  Map getSwitchs() {
		Map<String,JSONObject> switchs=new HashMap<String,JSONObject>();
		Connection con = null;
		ResultSet rs = null;
		Map shared_map = getNetworkShared();
		Map external_map = getNetworkExternal();
		try {
			con = getConnection("neutron");
			PreparedStatement ps = null;
			String sql = "select * from networks";//where tenant_id= scsssdfs;
			ps = (PreparedStatement) con.prepareStatement(sql);
			if (ps.execute()) {
				rs = ps.getResultSet();
				StringBuffer b = new StringBuffer();
				while (rs.next()) {
					JSONObject instance=new JSONObject();
					JSONObject metadata=new JSONObject();
					instance.put("component", "switch/"+rs.getString("id"));
					metadata.put("type", "switch");
					metadata.put("switch_id", rs.getString("id"));
					metadata.put("switch_status", rs.getString("status"));
					metadata.put("label", rs.getString("name"));
					if(shared_map.get(rs.getString("id"))!=null){
						metadata.put("shared", "true");
					}
					if(external_map.get(rs.getString("id"))!=null){
						metadata.put("router_external", "true");
					}
					instance.put("metadata", metadata);
					//System.out.println(instance);
					switchs.put("switch/"+rs.getString("id"), instance);
				}
			} else {
				int i = ps.getUpdateCount();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				con.close();
			} catch (Exception e2) {}		
		}
		return switchs;
	}
	public  JSONObject getTopo(){
		JSONObject topojson = new JSONObject();
		JSONObject processes = new JSONObject();
		Map ins	=getInstances();
		Iterator<Map.Entry<String, JSONObject>> it = ins.entrySet().iterator();
		while (it.hasNext()) {
		   Map.Entry<String, JSONObject> entry = it.next();
		   processes.put(entry.getKey(), entry.getValue());
		}
		Map routers= getRouters();
		Iterator<Map.Entry<String, JSONObject>> router = routers.entrySet().iterator();
		while (router.hasNext()) {
		   Map.Entry<String, JSONObject> entry = router.next();
		   processes.put(entry.getKey(), entry.getValue());
		}
		Map switchs= getSwitchs();
		Iterator<Map.Entry<String, JSONObject>> switcher = switchs.entrySet().iterator();
		while (switcher.hasNext()) {
		   Map.Entry<String, JSONObject> entry = switcher.next();
		   processes.put(entry.getKey(), entry.getValue());
		}
		topojson.put("processes", processes);

		List<JSONObject> lin = get_instance_net();
		List<JSONObject> lrn = get_router_net();
		for(int i=0;i<lin.size();i++){
			lrn.add(lin.get(i));
		}
		topojson.put("connections", lrn);
		System.out.println(topojson);
		return topojson;
	}
	public static void main(String[] args) {
		JSONObject jo = new JSONObject();
		//get_instance_net();
		//getInstances();
		//getRouters();
		//getSwitchs();
		//get_router_net();
		Topo topo=new Topo();
		topo.getTopo();
	}


}



猜你喜欢

转载自haoningabc.iteye.com/blog/2323130