二、功能开发
想要实现上面的场景,那么ODL要首先从OPS中获取token,然后用这个token去创建网络,添加子网,获取镜像和类型模板,创建多个虚拟机。流程如下图所示:
- package org.opendaylight.odlops.impl;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- importjava.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.json.JSONObject;
- public class Client {
- public static finalString ADD_URL ="http://192.168.1.103:5000/v2.0/tokens";
- public static Stringappadd() {
- String id = "";
- try{
- //创建连接
- URL url =new URL(ADD_URL);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestMethod("POST");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
- connection.connect();
- //P请求
- DataOutputStream out = newDataOutputStream(connection.getOutputStream());
- Stringpayload ="{\n "auth":{\n "passwordCredentials":{\n "username":"admin",\n "password":"bnibnibni"\n },\n "tenantName":"admin"\n }\n}";
- out.write(payload.getBytes("UTF-8"));
- out.flush();
- out.close();
- //读取响应
- BufferedReader reader = new BufferedReader(newInputStreamReader(
- connection.getInputStream()));
- Stringlines;
- StringBuilder sb = new StringBuilder();
- while((lines = reader.readLine()) != null) {
- lines = newString(lines.getBytes(), "utf-8");
- sb.append(lines);
- }
- JSONObjectjb = new JSONObject(sb.toString());
- id =jb.getJSONObject("access").getJSONObject("token").get("id").toString();
- reader.close();
- // 断开连接
- connection.disconnect();
- } catch (MalformedURLException e) {
- // TODO Auto-generated catchblock
- e.printStackTrace();
- } catch (UnsupportedEncodingException e){
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- return id;
- }
- }
这里我们需要引入json包,所以要在maven仓库网站上下载jsonjar包:
http://mvnrepository.com/artifact/org.json/json
然后再odlops/impl 的pom.xml文件中添加依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</dependency>
用maven命令将jar包引入maven本地仓库:
mvn install:install-file -Dfile="JSONPATH" -DgroupId=org.json -DartifactId=json-Dpackaging=jar
在OPSAPI介绍中会给出response的格式,例如返回的token就是一个JSONObject,那么就可以用JSON给出的函数进行数据的解析。
JSON用法可以参考:http://blog.csdn.net/jediael_lu/article/details/25779087
上面的代码获取了token的ID。我们可以用这个ID来进行之后的操作。
2、获取flavor ID
- package org.opendaylight.odlops.impl;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- importjava.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.json.JSONObject;
- import org.json.JSONArray;
- public class Flavors {
- public static finalString ADD_URL = "http://192.168.1.103:8774/v2/flavors";
- public static StringgetFlavorsList(String token) {
- //StringBuilder sb = new StringBuilder();
- //JSONObject jb = null;
- String flavorId = "";
- try{
- //创建连接
- URL url =new URL(ADD_URL);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestMethod("GET");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("X-Auth-Token", token);
- connection.connect();
- //请求
- //DataOutputStream out = newDataOutputStream(connection.getOutputStream());
- //out.write();
- //out.flush();
- //out.close();
- //读取响应
- BufferedReader reader = new BufferedReader(newInputStreamReader(
- connection.getInputStream()));
- Stringlines;
- StringBuilder sb = new StringBuilder();
- while((lines = reader.readLine()) != null) {
- lines = newString(lines.getBytes(), "utf-8");
- sb.append(lines);
- }
- JSONObjectjb = new JSONObject(sb.toString());
- JSONArrayja = jb.getJSONArray("flavors");
- flavorId =ja.getJSONObject(0).get("id").toString();
- reader.close();
- // 断开连接
- connection.disconnect();
- } catch (MalformedURLException e) {
- // TODO Auto-generated catchblock
- e.printStackTrace();
- } catch (UnsupportedEncodingException e){
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- return flavorId;
- }
- }
3、获取Image ID
- package org.opendaylight.odlops.impl;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- importjava.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.json.JSONObject;
- import org.json.JSONArray;
- public class Images {
- public static finalString ADD_URL = "http://192.168.1.103:9292/v2/images";
- public static StringgetImagesList(String token) {
- //StringBuilder sb = new StringBuilder();
- //JSONObject jb = null;
- String imagesId = "";
- try{
- //创建连接
- URL url =new URL(ADD_URL);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestMethod("GET");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("X-Auth-Token", token);
- connection.connect();
- //请求
- //DataOutputStream out = newDataOutputStream(connection.getOutputStream());
- //out.write();
- //out.flush();
- //out.close();
- //读取响应
- BufferedReader reader = new BufferedReader(newInputStreamReader(
- connection.getInputStream()));
- Stringlines;
- StringBuilder sb = new StringBuilder();
- while((lines = reader.readLine()) != null) {
- lines = newString(lines.getBytes(), "utf-8");
- sb.append(lines);
- }
- JSONObjectjb = new JSONObject(sb.toString());
- JSONArrayja = jb.getJSONArray("images");
- imagesId =ja.getJSONObject(0).get("id").toString();
- reader.close();
- // 断开连接
- connection.disconnect();
- } catch (MalformedURLException e) {
- // TODO Auto-generated catchblock
- e.printStackTrace();
- } catch (UnsupportedEncodingException e){
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- return imagesId;
- }
- }
4、创建网络并添加子网
- package org.opendaylight.odlops.impl;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- importjava.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.json.JSONObject;
- import org.json.JSONArray;
- public class Network {
- public static finalString ADD_URL = "http://192.168.1.103:9696/v2.0/networks";
- public static finalString ADD_URL1 = "http://192.168.1.103:9696/v2.0/subnets";
- public static StringgetNetworkList(String token) {
- StringBuilder sb = new StringBuilder();
- //JSONObject jb = null;
- try{
- //创建连接
- URL url =new URL(ADD_URL);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestMethod("GET");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("X-Auth-Token", token);
- connection.connect();
- //请求
- //DataOutputStream out = newDataOutputStream(connection.getOutputStream());
- //out.write();
- //out.flush();
- //out.close();
- //读取响应
- BufferedReader reader = new BufferedReader(newInputStreamReader(
- connection.getInputStream()));
- Stringlines;
- while((lines = reader.readLine()) != null) {
- lines = newString(lines.getBytes(), "utf-8");
- sb.append(lines);
- }
- //jb = newJSONObject(sb.toString());
- //id =jb.getJSONObject("access").getJSONObject("token").get("id").toString();
- reader.close();
- // 断开连接
- connection.disconnect();
- } catch (MalformedURLException e) {
- // TODO Auto-generated catchblock
- e.printStackTrace();
- } catch (UnsupportedEncodingException e){
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- return sb.toString();
- }
- public static StringcreateNetwork(String token) {
- StringBuilder sb1 = new StringBuilder();
- JSONObject jb = null;
- String networkId = "";
- String ip_pool = "";
- try{
- //创建连接
- URL url =new URL(ADD_URL);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestMethod("POST");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("X-Auth-Token", token);
- connection.connect();
- //请求
- Stringname = "net" + String.valueOf((int)(Math.random()*100));
- DataOutputStream out = newDataOutputStream(connection.getOutputStream());
- Stringpayload ="{\n "network":{\n "admin_state_up":true,\n "name":""+ name +"",\n "provider:network_type":"vxlan"\n }\n}";
- out.write(payload.getBytes("UTF-8"));
- out.flush();
- out.close();
- //读取响应
- BufferedReader reader = new BufferedReader(newInputStreamReader(
- connection.getInputStream()));
- Stringlines;
- StringBuilder sb = new StringBuilder();
- while((lines = reader.readLine()) != null) {
- lines = newString(lines.getBytes(), "utf-8");
- sb.append(lines);
- }
- jb = newJSONObject(sb.toString());
- JSONArrayja = new JSONArray("[" + jb.getJSONObject("network").toString() +"]");
- int l =ja.length();
- for (int i= 0; i < l; i++){
- if(ja.getJSONObject(i).get("name").toString().equals(name)) {
- networkId =ja.getJSONObject(i).get("id").toString();
- break;
- }
- }
- reader.close();
- connection.disconnect();
- //subnet
- URL url1 =new URL(ADD_URL1);
- HttpURLConnection connection1 = (HttpURLConnection)url1.openConnection();
- connection1.setDoOutput(true);
- connection1.setDoInput(true);
- connection1.setRequestMethod("POST");
- connection1.setUseCaches(false);
- connection1.setInstanceFollowRedirects(true);
- connection1.setRequestProperty("X-Auth-Token", token);
- connection1.connect();
- DataOutputStream out1 = newDataOutputStream(connection1.getOutputStream());
- Stringpayload1 ="{\n "subnet":{\n "network_id":"" + networkId +"",\n "ip_version":4,\n "cidr":"192.168." + String.valueOf((int)(Math.random()*255)) +".0/24"\n }\n}";
- out1.write(payload1.getBytes("UTF-8"));
- out1.flush();
- out1.close();
- BufferedReader reader1 = new BufferedReader(newInputStreamReader(
- connection1.getInputStream()));
- Stringlines1;
- while((lines1 = reader1.readLine()) != null) {
- lines1 = newString(lines1.getBytes(), "utf-8");
- sb1.append(lines1);
- }
- JSONObjectjb1 = new JSONObject(sb1.toString());
- ip_pool =jb1.getJSONObject("subnet").get("allocation_pools").toString();
- reader1.close();
- connection1.disconnect();
- } catch (MalformedURLException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (UnsupportedEncodingException e){
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- return networkId;
- }
- }
5、创建虚拟机
- package org.opendaylight.odlops.impl;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- importjava.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.json.JSONObject;
- public class ServersService {
- public static finalString ADD_URL ="http://192.168.1.103:8774/v2/servers";
- public static String createServers(String token) {
- StringBuilder sb = new StringBuilder();
- //JSONObject jb = null;
- String networkId = "";
- String flavorId = "";
- String imageId = "";
- try{
- //bulidnetwork
- Network n= new Network();
- networkId= n.createNetwork(token);
- //images
- Images i =new Images();
- imageId =i.getImagesList(token);
- //flavors
- Flavors f= new Flavors();
- flavorId =f.getFlavorsList(token);
- URL url =new URL(ADD_URL);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setRequestMethod("POST");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("X-Auth-Token", token);
- connection.setRequestProperty("Content-Type","application/json");
- connection.connect();
- //请求
- DataOutputStream out = newDataOutputStream(connection.getOutputStream());
- Stringpayload ="{\n "server":{\n "name":"haha",\n "imageRef": "" + imageId +"",\n "flavorRef": "" + flavorId +"",\n "availability_zone":"nova",\n "networks":[\n {\n "uuid":"" + networkId +""\n }\n ],\n "security_groups":[\n {\n "name":"default"\n }\n ],\n "min_count":"2",\n "max_count":"3"\n }\n}";
- out.write(payload.getBytes("UTF-8"));
- out.flush();
- out.close();
- //读取响应
- BufferedReader reader = new BufferedReader(newInputStreamReader(
- connection.getInputStream()));
- Stringlines;
- while((lines = reader.readLine()) != null) {
- lines = newString(lines.getBytes(), "utf-8");
- sb.append(lines);
- }
- reader.close();
- connection.disconnect();
- } catch (MalformedURLException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (UnsupportedEncodingException e){
- // TODOAuto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODOAuto-generated catch block
- e.printStackTrace();
- }
- return sb.toString();
- }
- }
6、修改OdlImps.java文件
- package org.opendaylight.odlops.impl;
- import java.util.concurrent.Future;
- importorg.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odlops.rev150105.OdlopsService;
- importorg.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odlops.rev150105.OdlInput;
- importorg.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odlops.rev150105.OdlOutput;
- importorg.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odlops.rev150105.OdlOutputBuilder;
- import org.opendaylight.yangtools.yang.common.RpcResult;
- importorg.opendaylight.yangtools.yang.common.RpcResultBuilder;
- public class OdlImpl implements OdlopsService {
- @Override
- public Future>odl(OdlInput input) {
- OdlOutputBuilder odlBuilder = newOdlOutputBuilder();
- Client c = new Client();
- if(input.getOperation().equals("createservers")){
- ServersService s = newServersService();
- odlBuilder.setGreeting(s.createServers(c.appadd()));
- }
- returnRpcResultBuilder.success(odlBuilder.build()).buildFuture();
- }
- }
7、验证
验证操作与上面建立工程时一样,也可以通过openstackdashboard界面看虚拟机及网络是否建立成功。
该工程可以在github上下载:https://github.com/wuliheihei/odlops.git