当前位置: 首页 > 工具软件 > dhcp4j > 使用案例 >

使用openstack4j构建网络与一些坑

裴兴言
2023-12-01

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请求。最后发现只能把这个参数去掉了。

以上都是本人自己使用的时候遇到的一些问题,只是简单的一个入门。写的有出入的地方希望大家能够指出来,一起进步。

 类似资料: