openstack4jAPI:http://www.openstack4j.com/learn
openstackAPI:https://developer.openstack.org/zh_CN/api-guide/quick-start
简单使用步骤():maven导入依赖包(不同包API有出入,以下内容都是3.2.0版本)
<dependency>
<groupId>org.pacesys</groupId>
<artifactId>openstack4j</artifactId>
<version>3.2.0</version>
</dependency>
1、认证:认证方式有v2与v3两种,两种方式支持不同版本的openstack。
v2版本:
OSClient.OSClientV2 os = OSFactory.builderV2().
endpoint("http://ip:5000/v2.0").tenantName("admin").credentials("admin", "admin").authenticate();
v3版本:v3版本中有域的概念,我使用的是默认的Default域
Identifier domainIdentifier = Identifier.byName("Default");
OSClient.OSClientV3 os3 = OSFactory.builderV3()
.endpoint("http://ip:5000/v3")
.credentials("admin", "Free-Wi11", domainIdentifier)
.authenticate();
2、创建网络:创建网络需先创建network再创建子网
创建网络:tenantId在旧版本指的租户ID,在新版本指的是项目ID其实是一个东西
List<? extends Project> projectList = os3.identity().projects().list();
//tenantId通过遍历上面获取(根据自己的需求)
//创建网络
Network network = os3.networking().network().create(Builders.network()
.name("networke4j").tenantId(tenantId)
.adminStateUp(true).isShared(true).isRouterExternal(true).build());
//创建子网(cidr指的是192.168.168.1/24类似的格式,用来指定子网网段的)
Subnet subnet = os3.networking().subnet().create(Builders.subnet()
.name("subnete4j")
.networkId(network.getId())
.tenantId(tenantId).enableDHCP(true).addDNSNameServer("8.8.8.8")
.ipVersion(IPVersionType.V4)
.cidr("ip/掩码")
.build());
3、创建路由:创建路由后需创建内部接口和外部网络(如果需要访问外网需指定外部接口)
//没有外部网络
Router router = os3.networking().router().create(Builders.router()
.name("router4j")
.adminStateUp(true)
.build());
//或者有外部网络
Router router = os3.networking().router().create(Builders.router()
.name("router4j")
.adminStateUp(true)
.externalGateway("name")//指定网关(外部接口)
.build());
//绑定内部接口(netid为子网ID)
os3.networking().router().attachInterface(router.getId(), AttachInterfaceType.SUBNET, netId);
4、创建实例、镜像、端口、实例类别(创建实例时需指定镜像与实例类别)
//创建镜像
Payload<File> filePayload = Payloads.create( file );//上传的镜像
Image imageBuild = Builders.imageV2()
.name( topologyImageVo.getImageName() )
.containerFormat( ContainerFormat.BARE )
.visibility( Image.ImageVisibility.PUBLIC )
.isProtected( true )
.diskFormat( DiskFormat.QCOW2 )
.minDisk( "" )
.minRam( "" )
.build();
Image image = os3.imagesV2().create( imageBuild );
os3.imagesV2().upload( id, filePayload, image );
//创建实例类别
Flavor flavor = Builders.flavor()
.name("name")
.ram(4096)
.vcpus(6)
.disk(120)
.build();
flavor = os3.compute().flavors().create(flavor);
//创建实例(netList是一个网络ID的集合)这种是dhcp分配ip
ServerCreate sc = Builders.server().name("instance4j").flavor(flavor )
.networks(netList).image(imageId).build();
boot = os3.compute().servers().boot(sc);//初始化实例
//创建实例指定IP(指定的IP其实对应的是端口)在端口中指出绑定的fixedIp
Port port = os3.networking().port().create(Builders.port()
.name("port4j").networkId("网络id").fixedIp(ip, "子网id").build());
ServerCreate sc = Builders.server().name("instance4j"+oso.getTopologyId()).flavor(flavor)
.addNetworkPort(port.getId()).image(imageId).build();//主要去掉networks,不然会绑定两个IP上去
boot = os3.compute().servers().boot(sc);
5、获取VNC远程桌面
VNCConsole console = os3.compute().servers().getVNCConsole("实例ID", VNCConsole.Type.NOVNC);
String url = console.getURL();//直接浏览器远程访问即可
一些遇到的坑
1、获取所有的镜像的时候,这三种如果用v2上传,第一个获取不到值,第二个获取到所有镜像但是只有25个(默认查询25个),第三个全部获取到了。之前没有发现第三个方法,用了第二种发现list里面可以封装参数(类似于分页查询,最后参考openstack的文档发现可以封装一个map,limit与最大值 就可以实现了具体参数参考https://developer.openstack.org/api-ref/image/v2/index.html#show-images)
List<? extends Image> list = os3.images().list();
List<? extends org.openstack4j.model.image.v2.Image> list1 = os3.imagesV2().list();
List<? extends org.openstack4j.model.compute.Image> list2 = os3.compute().images().list();
Map<String, String> paramMap = new HashMap<>();
paramMap.put("limit","数量");
List<? extends Image> images = os3.imagesV2().list(paramMap);
2、就是创建网络的时候需要上传一个租户ID,新版本改成了项目ID,找了好久才找到。。。
3、在创建子网的时候不支持addPool方法,异常信息是不支持post请求。最后发现只能把这个参数去掉了。
以上都是本人自己使用的时候遇到的一些问题,只是简单的一个入门。写的有出入的地方希望大家能够指出来,一起进步。