package org.zstack.header.network.l3; import org.apache.commons.net.util.SubnetUtils; import org.apache.commons.net.util.SubnetUtils.SubnetInfo; import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.network.NetworkUtils; import java.io.Serializable; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @inventory inventory for ip range * @category l3network * @example { * "inventory": { * "uuid": "b1cfcdeca4024d13ac82edbe8d959720", * "l3NetworkUuid": "50e637dc68b7480291ba87cbb81d94ad", * "name": "TestIpRange", * "description": "Test", * "startIp": "10.0.0.100", * "endIp": "10.10.1.200", * "netmask": "255.0.0.0", * "gateway": "10.0.0.1", * "createDate": "May 4, 2014 4:30:23 PM", * "lastOpDate": "May 4, 2014 4:30:23 PM" * } * } * @since 0.1.0 */ @Inventory(mappingVOClass = IpRangeVO.class) @PythonClassInventory @ExpandedQueries({ @ExpandedQuery(expandedField = "l3Network", inventoryClass = L3NetworkInventory.class, foreignKey = "l3NetworkUuid", expandedInventoryKey = "uuid") }) public class IpRangeInventory implements Serializable { /** * @desc ip range uuid */ private String uuid; /** * @desc uuid of l3Network this ip range belongs to. See :ref:`L3NetworkInventory` */ private String l3NetworkUuid; /** * @desc max length of 255 characters */ private String name; /** * @desc max length of 2048 characters */ private String description; /** * @desc start ip address, in IPv4 */ private String startIp; /** * @desc end ip address, in IPv4 */ private String endIp; /** * @desc netmask, in IPv4 */ private String netmask; /** * @desc gateway, in IPv4 */ private String gateway; private String networkCidr; /** * @desc the time this resource gets created */ private Timestamp createDate; /** * @desc last time this resource gets operated */ private Timestamp lastOpDate; public static IpRangeInventory valueOf(IpRangeVO vo) { IpRangeInventory inv = new IpRangeInventory(); inv.setCreateDate(vo.getCreateDate()); inv.setDescription(vo.getDescription()); inv.setEndIp(vo.getEndIp()); inv.setGateway(vo.getGateway()); inv.setL3NetworkUuid(vo.getL3NetworkUuid()); inv.setName(vo.getName()); inv.setNetmask(vo.getNetmask()); inv.setStartIp(vo.getStartIp()); inv.setUuid(vo.getUuid()); inv.setLastOpDate(vo.getLastOpDate()); inv.setNetworkCidr(vo.getNetworkCidr()); return inv; } public static List<IpRangeInventory> valueOf(Collection<IpRangeVO> vos) { List<IpRangeInventory> invs = new ArrayList<IpRangeInventory>(vos.size()); for (IpRangeVO vo : vos) { invs.add(IpRangeInventory.valueOf(vo)); } return invs; } public String getNetworkCidr() { return networkCidr; } public void setNetworkCidr(String networkCidr) { this.networkCidr = networkCidr; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getL3NetworkUuid() { return l3NetworkUuid; } public void setL3NetworkUuid(String l3NetworkUuid) { this.l3NetworkUuid = l3NetworkUuid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getStartIp() { return startIp; } public void setStartIp(String startIp) { this.startIp = startIp; } public String getEndIp() { return endIp; } public void setEndIp(String endIp) { this.endIp = endIp; } public String getNetmask() { return netmask; } public void setNetmask(String netmask) { this.netmask = netmask; } public String getGateway() { return gateway; } public void setGateway(String gateway) { this.gateway = gateway; } public Timestamp getCreateDate() { return createDate; } public void setCreateDate(Timestamp createDate) { this.createDate = createDate; } public Timestamp getLastOpDate() { return lastOpDate; } public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } @Override public String toString() { return JSONObjectUtil.toJsonString(this); } public static IpRangeInventory fromMessage(APIAddIpRangeMsg msg) { IpRangeInventory ipr = new IpRangeInventory(); ipr.setName(msg.getName()); ipr.setDescription(msg.getDescription()); ipr.setStartIp(msg.getStartIp()); ipr.setEndIp(msg.getEndIp()); ipr.setNetmask(msg.getNetmask()); ipr.setGateway(msg.getGateway()); ipr.setL3NetworkUuid(msg.getL3NetworkUuid()); SubnetUtils su = new SubnetUtils(msg.getGateway(), msg.getNetmask()); ipr.setNetworkCidr(su.getInfo().getCidrSignature()); ipr.setUuid(msg.getResourceUuid()); return ipr; } public static IpRangeInventory fromMessage(APIAddIpRangeByNetworkCidrMsg msg) { SubnetUtils utils = new SubnetUtils(msg.getNetworkCidr()); SubnetInfo subnet = utils.getInfo(); IpRangeInventory ipr = new IpRangeInventory(); ipr.setNetworkCidr(msg.getNetworkCidr()); ipr.setName(msg.getName()); ipr.setDescription(msg.getDescription()); String gateway = subnet.getLowAddress(); String startIp = NetworkUtils.longToIpv4String(NetworkUtils.ipv4StringToLong(subnet.getLowAddress()) + 1); String endIp = subnet.getHighAddress(); ipr.setGateway(gateway); ipr.setStartIp(startIp); ipr.setEndIp(endIp); ipr.setNetmask(subnet.getNetmask()); ipr.setL3NetworkUuid(msg.getL3NetworkUuid()); ipr.setUuid(msg.getResourceUuid()); return ipr; } public SubnetUtils toSubnetUtils() { return new SubnetUtils(new SubnetUtils(gateway, netmask).getInfo().getNetworkAddress(), netmask); } }