Example usage for org.apache.commons.net.util SubnetUtils getInfo

List of usage examples for org.apache.commons.net.util SubnetUtils getInfo

Introduction

In this page you can find the example usage for org.apache.commons.net.util SubnetUtils getInfo.

Prototype

public final SubnetInfo getInfo() 

Source Link

Document

Return a SubnetInfo instance that contains subnet-specific statistics

Usage

From source file:com.infinities.skyport.openstack.nova.os.compute.SkyportNovaServer.java

/**
 * @param server/*from   w  w w .j  a v  a 2 s.c o m*/
 * @param nets
 * @param ipv6
 * @param ipv4
 * @return
 * @throws InternalException
 * @throws JSONException
 * @throws CloudException
 */
private NovaStyleVirtualMachine toNovaStyleVirtualMachine(JSONObject server, Iterable<IpAddress> ipv4,
        Iterable<IpAddress> ipv6, Iterable<VLAN> networks)
        throws InternalException, JSONException, CloudException {
    if (server == null) {
        return null;
    }
    NovaStyleVirtualMachine vm = new NovaStyleVirtualMachine();
    String description = null;

    // vm.setCurrentState(VmState.RUNNING);
    vm.setArchitecture(Architecture.I64);
    vm.setClonable(false);
    vm.setCreationTimestamp(-1L);
    vm.setImagable(false);
    vm.setLastBootTimestamp(-1L);
    vm.setLastPauseTimestamp(-1L);
    vm.setPausable(false);
    vm.setPersistent(true);
    vm.setPlatform(Platform.UNKNOWN);
    vm.setRebootable(true);
    vm.setProviderOwnerId(novaServer.getTenantId());

    if (novaServer.getCloudProvider().equals(OpenStackProvider.RACKSPACE)) {
        vm.setPersistent(false);
    }

    if (server.has("id")) {
        vm.setProviderVirtualMachineId(server.getString("id"));
    } else
        return null;
    if (server.has("name")) {
        vm.setName(server.getString("name"));
    }
    if (server.has("description") && !server.isNull("description")) {
        description = server.getString("description");
    }
    if (server.has("kernel_id")) {
        vm.setProviderKernelImageId(server.getString("kernel_id"));
    }
    if (server.has("ramdisk_id")) {
        vm.setProviderRamdiskImageId(server.getString("ramdisk_id"));
    }
    JSONObject md = (server.has("metadata") && !server.isNull("metadata")) ? server.getJSONObject("metadata")
            : null;

    Map<String, String> map = new HashMap<String, String>();
    boolean imaging = false;

    if (md != null) {
        if (md.has("org.dasein.description") && vm.getDescription() == null) {
            description = md.getString("org.dasein.description");
        } else if (md.has("Server Label")) {
            description = md.getString("Server Label");
        }
        if (md.has("org.dasein.platform")) {
            try {
                vm.setPlatform(Platform.valueOf(md.getString("org.dasein.platform")));
            } catch (Throwable ignore) {
                // ignore
            }
        }
        String[] keys = JSONObject.getNames(md);

        if (keys != null) {
            for (String key : keys) {
                String value = md.getString(key);

                if (value != null) {
                    map.put(key, value);
                }
            }
        }
    }
    if (server.has("OS-EXT-STS:task_state") && !server.isNull("OS-EXT-STS:task_state")) {
        String t = server.getString("OS-EXT-STS:task_state");

        map.put("OS-EXT-STS:task_state", t);
        imaging = t.equalsIgnoreCase("image_snapshot");
    }
    if (description == null) {
        if (vm.getName() == null) {
            vm.setName(vm.getProviderVirtualMachineId());
        }
        vm.setDescription(vm.getName());
    } else {
        vm.setDescription(description);
    }
    if (server.has("hostId")) {
        map.put("host", server.getString("hostId"));
    }
    vm.setTags(map);
    if (server.has("image") && !server.isNull("image")) {
        try {
            JSONObject img = server.getJSONObject("image");

            if (img.has("id")) {
                vm.setProviderMachineImageId(img.getString("id"));
            }
        } catch (JSONException ex) {
            logger.error("Unable to parse the image object");
            try {
                server.getString("image");
                logger.error(
                        "Image object has been returned as a string from cloud " + server.getString("image"));
            } catch (JSONException ignore) {
            }
        }
    }
    if (server.has("flavor")) {
        JSONObject f = server.getJSONObject("flavor");

        if (f.has("id")) {
            vm.setProductId(f.getString("id"));
        }
    } else if (server.has("flavorId")) {
        vm.setProductId(server.getString("flavorId"));
    }
    if (server.has("adminPass")) {
        vm.setRootPassword(server.getString("adminPass"));
    }
    if (server.has("key_name")) {
        vm.setProviderShellKeyIds(server.getString("key_name"));
    }
    if (server.has("status")) {
        String s = server.getString("status").toLowerCase();

        if (s.equals("active")) {
            vm.setCurrentState(VmState.RUNNING);
        } else if (s.startsWith("build")) {
            vm.setCurrentState(VmState.PENDING);
        } else if (s.equals("deleted")) {
            vm.setCurrentState(VmState.TERMINATED);
        } else if (s.equals("suspended")) {
            vm.setCurrentState(VmState.SUSPENDED);
        } else if (s.equalsIgnoreCase("paused")) {
            vm.setCurrentState(VmState.PAUSED);
        } else if (s.equalsIgnoreCase("stopped") || s.equalsIgnoreCase("shutoff")) {
            vm.setCurrentState(VmState.STOPPED);
        } else if (s.equalsIgnoreCase("stopping")) {
            vm.setCurrentState(VmState.STOPPING);
        } else if (s.equalsIgnoreCase("pausing")) {
            vm.setCurrentState(VmState.PAUSING);
        } else if (s.equalsIgnoreCase("suspending")) {
            vm.setCurrentState(VmState.SUSPENDING);
        } else if (s.equals("error")) {
            vm.setCurrentState(VmState.ERROR);
        } else if (s.equals("reboot") || s.equals("hard_reboot")) {
            vm.setCurrentState(VmState.REBOOTING);
        } else {
            logger.warn("toVirtualMachine(): Unknown server state: " + s);
            vm.setCurrentState(VmState.PENDING);
        }
    }
    if (vm.getCurrentState() == null && imaging) {
        vm.setCurrentState(VmState.PENDING);
    }
    if (server.has("created")) {
        vm.setCreationTimestamp(NovaOpenStack.parseTimestamp(server.getString("created")));
    }
    if (server.has("addresses")) {
        JSONObject addrs = server.getJSONObject("addresses");
        String[] names = JSONObject.getNames(addrs);

        if (names != null && names.length > 0) {
            List<SkyportRawAddress> pub = new ArrayList<SkyportRawAddress>();
            List<SkyportRawAddress> priv = new ArrayList<SkyportRawAddress>();

            for (String name : names) {
                JSONArray arr = addrs.getJSONArray(name);

                String subnet = null;
                for (int i = 0; i < arr.length(); i++) {
                    SkyportRawAddress addr = null;
                    String type = null;

                    if (novaServer.getMinorVersion() == 0 && novaServer.getMajorVersion() == 1) {
                        addr = new SkyportRawAddress(arr.getString(i).trim(), IPVersion.IPV4, name);
                    } else {
                        JSONObject a = arr.getJSONObject(i);
                        type = a.optString("OS-EXT-IPS:type");

                        if (a.has("version") && a.getInt("version") == 4 && a.has("addr")) {
                            subnet = a.getString("addr");
                            addr = new SkyportRawAddress(a.getString("addr"), IPVersion.IPV4, name);
                        } else if (a.has("version") && a.getInt("version") == 6 && a.has("addr")) {
                            subnet = a.getString("addr");
                            addr = new SkyportRawAddress(a.getString("addr"), IPVersion.IPV6, name);
                        }
                    }
                    if (addr != null) {
                        if ("public".equalsIgnoreCase(name) || "internet".equalsIgnoreCase(name)) {
                            pub.add(addr);
                        } else if ("floating".equalsIgnoreCase(type)) {
                            pub.add(addr);
                        } else if ("fixed".equalsIgnoreCase(type)) {
                            priv.add(addr);
                        } else if (addr.isPublicIpAddress()) {
                            pub.add(addr);
                        } else {
                            priv.add(addr);
                        }
                    }
                }
                if (vm.getProviderVlanId() == null) { // &&
                    // !name.equals("public")
                    // &&
                    // !name.equals("private")
                    // &&
                    // !name.equals("nova_fixed")
                    // ) {
                    for (VLAN network : networks) {
                        if (network.getName().equals(name)) {
                            vm.setProviderVlanId(network.getProviderVlanId());
                            // get subnet
                            NetworkServices services = novaServer.getNovaOpenStack().getNetworkServices();
                            VLANSupport support = services.getVlanSupport();
                            Iterable<Subnet> subnets = support.listSubnets(network.getProviderVlanId());
                            for (Subnet sub : subnets) {
                                try {
                                    SubnetUtils utils = new SubnetUtils(sub.getCidr());

                                    if (utils.getInfo().isInRange(subnet)) {
                                        vm.setProviderSubnetId(sub.getProviderSubnetId());
                                        break;
                                    }
                                } catch (IllegalArgumentException arg) {
                                    logger.warn("Couldn't match against an invalid CIDR: " + sub.getCidr());
                                    continue;
                                }
                            }
                            break;
                        }
                    }
                }
            }
            vm.setPublicAddresses(pub.toArray(new SkyportRawAddress[pub.size()]));
            vm.setPrivateAddresses(priv.toArray(new SkyportRawAddress[priv.size()]));
        }
        SkyportRawAddress[] raw = vm.getPublicAddresses();

        if (raw != null) {
            for (SkyportRawAddress addr : vm.getPublicAddresses()) {
                if (addr.getVersion().equals(IPVersion.IPV4)) {
                    for (IpAddress a : ipv4) {
                        if (a.getRawAddress().getIpAddress().equals(addr.getIpAddress())) {
                            vm.setProviderAssignedIpAddressId(a.getProviderIpAddressId());
                            break;
                        }
                    }
                } else if (addr.getVersion().equals(IPVersion.IPV6)) {
                    for (IpAddress a : ipv6) {
                        if (a.getRawAddress().getIpAddress().equals(addr.getIpAddress())) {
                            vm.setProviderAssignedIpAddressId(a.getProviderIpAddressId());
                            break;
                        }
                    }
                }
            }
        }
        if (vm.getProviderAssignedIpAddressId() == null) {
            for (IpAddress addr : ipv4) {
                String serverId = addr.getServerId();

                if (serverId != null && serverId.equals(vm.getProviderVirtualMachineId())) {
                    vm.setProviderAssignedIpAddressId(addr.getProviderIpAddressId());
                    break;
                }
            }
            if (vm.getProviderAssignedIpAddressId() == null) {
                for (IpAddress addr : ipv6) {
                    String serverId = addr.getServerId();

                    if (serverId != null && addr.getServerId().equals(vm.getProviderVirtualMachineId())) {
                        vm.setProviderAssignedIpAddressId(addr.getProviderIpAddressId());
                        break;
                    }
                }
            }
        }
        if (vm.getProviderAssignedIpAddressId() == null) {
            for (IpAddress addr : ipv6) {
                if (addr.getServerId().equals(vm.getProviderVirtualMachineId())) {
                    vm.setProviderAssignedIpAddressId(addr.getProviderIpAddressId());
                    break;
                }
            }
        }
    }
    vm.setProviderRegionId(novaServer.getRegionId());
    vm.setProviderDataCenterId(vm.getProviderRegionId() + "-a");
    vm.setTerminationTimestamp(-1L);
    if (vm.getName() == null) {
        vm.setName(vm.getProviderVirtualMachineId());
    }
    if (vm.getDescription() == null) {
        vm.setDescription(vm.getName());
    }

    if (Platform.UNKNOWN.equals(vm.getPlatform())) {
        vm.setPlatform(
                novaServer.getPlatform(vm.getName(), vm.getDescription(), vm.getProviderMachineImageId()));
    }
    vm.setImagable(vm.getCurrentState() == null);
    vm.setRebootable(vm.getCurrentState() == null);

    if (novaServer.getCloudProvider().equals(OpenStackProvider.RACKSPACE)) {
        // Rackspace does not support the concept for firewalls in servers
        vm.setProviderFirewallIds(null);
    } else {
        Iterable<String> fwIds = novaServer.listFirewalls(vm.getProviderVirtualMachineId(), server);
        int count = Iterators.size(fwIds.iterator());

        String[] ids = new String[count];
        int i = 0;

        for (String id : fwIds) {
            ids[i++] = id;
        }
        vm.setProviderFirewallIds(ids);
    }
    return vm;
}

From source file:nfinity.FindPeer.java

public String ScanNetwork() {
    try {//from w  w w  .  j a v  a 2 s . c  o  m
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets)) {
            Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
            for (InetAddress inetAddress : Collections.list(inetAddresses)) {
                if (!inetAddress.getClass().toString().equals("class java.net.Inet6Address")) {
                    if (!inetAddress.isLoopbackAddress()) {
                        try {
                            SubnetUtils utils = new SubnetUtils(inetAddress.getHostAddress() + "/"
                                    + netint.getInterfaceAddresses().get(1).getNetworkPrefixLength());
                            String[] allIps = utils.getInfo().getAllAddresses();
                            return ConnectIP(allIps, inetAddress);
                        } catch (IllegalArgumentException ex) {
                            int prefix = NetworkInterface.getByInetAddress(inetAddress).getInterfaceAddresses()
                                    .get(0).getNetworkPrefixLength();
                            if (!inetAddress.isLoopbackAddress()) {
                                System.out
                                        .println("IP: " + inetAddress.getHostAddress() + " Prefix: " + prefix);
                                SubnetUtils utils = new SubnetUtils(
                                        inetAddress.getHostAddress() + "/" + prefix);
                                String[] allIps = utils.getInfo().getAllAddresses();
                                return ConnectIP(allIps, inetAddress);
                            }
                        }
                    }
                }
            }
        }
    } catch (SocketException ex) {
        System.out.println("Connection failed " + ex.getMessage());
    }
    return "Peer not found";
}

From source file:org.apache.commons.net.examples.cidr.SubnetUtilsExample.java

public static void main(String[] args) {
    String subnet = "192.168.0.3/31";
    SubnetUtils utils = new SubnetUtils(subnet);
    SubnetInfo info = utils.getInfo();

    System.out.printf("Subnet Information for %s:%n", subnet);
    System.out.println("--------------------------------------");
    System.out.printf("IP Address:\t\t\t%s\t[%s]%n", info.getAddress(),
            Integer.toBinaryString(info.asInteger(info.getAddress())));
    System.out.printf("Netmask:\t\t\t%s\t[%s]%n", info.getNetmask(),
            Integer.toBinaryString(info.asInteger(info.getNetmask())));
    System.out.printf("CIDR Representation:\t\t%s%n%n", info.getCidrSignature());

    System.out.printf("Supplied IP Address:\t\t%s%n%n", info.getAddress());

    System.out.printf("Network Address:\t\t%s\t[%s]%n", info.getNetworkAddress(),
            Integer.toBinaryString(info.asInteger(info.getNetworkAddress())));
    System.out.printf("Broadcast Address:\t\t%s\t[%s]%n", info.getBroadcastAddress(),
            Integer.toBinaryString(info.asInteger(info.getBroadcastAddress())));
    System.out.printf("Low Address:\t\t\t%s\t[%s]%n", info.getLowAddress(),
            Integer.toBinaryString(info.asInteger(info.getLowAddress())));
    System.out.printf("High Address:\t\t\t%s\t[%s]%n", info.getHighAddress(),
            Integer.toBinaryString(info.asInteger(info.getHighAddress())));

    System.out.printf("Total usable addresses: \t%d%n", Long.valueOf(info.getAddressCountLong()));
    System.out.printf("Address List: %s%n%n", Arrays.toString(info.getAllAddresses()));

    final String prompt = "Enter an IP address (e.g. 192.168.0.10):";
    System.out.println(prompt);/*w  w w . j  a  va2  s.  c om*/
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNextLine()) {
        String address = scanner.nextLine();
        System.out.println("The IP address [" + address + "] is " + (info.isInRange(address) ? "" : "not ")
                + "within the subnet [" + subnet + "]");
        System.out.println(prompt);
    }
    scanner.close();
}

From source file:org.apache.hadoop.util.MachineList.java

/**
 * Accepts a collection of ip/cidr/host addresses
 * //  w  w  w  .jav a  2s. co m
 * @param hostEntries
 * @param addressFactory addressFactory to convert host to InetAddress
 */
public MachineList(Collection<String> hostEntries, InetAddressFactory addressFactory) {
    this.addressFactory = addressFactory;
    if (hostEntries != null) {
        if ((hostEntries.size() == 1) && (hostEntries.contains(WILDCARD_VALUE))) {
            all = true;
            ipAddresses = null;
            hostNames = null;
            cidrAddresses = null;
        } else {
            all = false;
            Set<String> ips = new HashSet<String>();
            List<SubnetUtils.SubnetInfo> cidrs = new LinkedList<SubnetUtils.SubnetInfo>();
            Set<String> hosts = new HashSet<String>();
            for (String hostEntry : hostEntries) {
                //ip address range
                if (hostEntry.indexOf("/") > -1) {
                    try {
                        SubnetUtils subnet = new SubnetUtils(hostEntry);
                        subnet.setInclusiveHostCount(true);
                        cidrs.add(subnet.getInfo());
                    } catch (IllegalArgumentException e) {
                        LOG.warn("Invalid CIDR syntax : " + hostEntry);
                        throw e;
                    }
                } else if (InetAddresses.isInetAddress(hostEntry)) { //ip address
                    ips.add(hostEntry);
                } else { //hostname
                    hosts.add(hostEntry);
                }
            }
            ipAddresses = (ips.size() > 0) ? ips : null;
            cidrAddresses = (cidrs.size() > 0) ? cidrs : null;
            hostNames = (hosts.size() > 0) ? hosts : null;
        }
    } else {
        all = false;
        ipAddresses = null;
        hostNames = null;
        cidrAddresses = null;
    }
}

From source file:org.apache.metron.alerts.adapters.RangeChecker.java

static boolean checkRange(Set<String> CIDR_networks, String ip) {
    for (String network : CIDR_networks) {

        System.out.println("Looking at range: " + network + " and ip " + ip);
        SubnetUtils utils = new SubnetUtils(network);
        if (utils.getInfo().isInRange(ip)) {
            System.out.println(ip + " in range " + network);
            return true;
        }/*  ww w  .  ja  v  a 2  s . c  o m*/
    }

    //no matches
    return false;
}

From source file:org.apache.nifi.cluster.firewall.impl.FileBasedClusterNodeFirewall.java

private void parseConfig(final File config) throws IOException {

    // clear old information
    subnetInfos.clear();//  ww w  .  ja  v a 2s  .c o  m
    try (BufferedReader br = new BufferedReader(new FileReader(config))) {

        String ipOrHostLine;
        String ipCidr;
        int totalIpsAdded = 0;
        while ((ipOrHostLine = br.readLine()) != null) {

            // cleanup whitespace
            ipOrHostLine = ipOrHostLine.trim();

            if (ipOrHostLine.isEmpty() || ipOrHostLine.startsWith("#")) {
                // skip empty lines or comments
                continue;
            } else if (ipOrHostLine.contains("#")) {
                // parse out comments in IP containing lines
                ipOrHostLine = ipOrHostLine.substring(0, ipOrHostLine.indexOf("#")).trim();
            }

            // if given a complete IP, then covert to CIDR
            if (ipOrHostLine.contains("/")) {
                ipCidr = ipOrHostLine;
            } else if (ipOrHostLine.contains("\\")) {
                logger.warn(
                        "CIDR IP notation uses forward slashes '/'.  Replacing backslash '\\' with forward slash'/' for '{}'",
                        ipOrHostLine);
                ipCidr = ipOrHostLine.replace("\\", "/");
            } else {
                try {
                    ipCidr = InetAddress.getByName(ipOrHostLine).getHostAddress();
                    if (!ipOrHostLine.equals(ipCidr)) {
                        logger.debug("Resolved host '{}' to ip '{}'", ipOrHostLine, ipCidr);
                    }
                    ipCidr += "/32";
                    logger.debug("Adding CIDR to exact IP: '{}'", ipCidr);
                } catch (final UnknownHostException uhe) {
                    logger.warn("Firewall is skipping unknown host address: '{}'", ipOrHostLine);
                    continue;
                }
            }

            try {
                logger.debug("Adding CIDR IP to firewall: '{}'", ipCidr);
                final SubnetUtils subnetUtils = new SubnetUtils(ipCidr);
                subnetUtils.setInclusiveHostCount(true);
                subnetInfos.add(subnetUtils.getInfo());
                totalIpsAdded++;
            } catch (final IllegalArgumentException iae) {
                logger.warn("Firewall is skipping invalid CIDR address: '{}'", ipOrHostLine);
            }

        }

        if (totalIpsAdded == 0) {
            logger.info("No IPs added to firewall.  Firewall will accept all requests.");
        } else {
            logger.info(
                    "Added {} IP(s) to firewall.  Only requests originating from the configured IPs will be accepted.",
                    totalIpsAdded);
        }

    }
}

From source file:org.calrissian.mango.domain.CidrValueRangeIPv4.java

public CidrValueRangeIPv4(String cidrString) {

    SubnetUtils utils = new SubnetUtils(cidrString);
    SubnetUtils.SubnetInfo info = utils.getInfo();

    setStart(new IPv4(info.getNetworkAddress()));
    setStop(new IPv4(info.getBroadcastAddress()));
}

From source file:org.cloudsimulator.controller.LocalNetworkController.java

public LocalNetworkController(final LocalNetwork localNetwork) {
    super();/*from w  ww  .j ava 2 s  .  c o  m*/
    SubnetUtils subNetUtils = new SubnetUtils(localNetwork.getHasIPAddress(),
            localNetwork.getHasSubNetworkMask());
    SubnetInfo subNetInfo = subNetUtils.getInfo();
    this.allAddresses = subNetInfo.getAllAddresses();
    this.addressCount = subNetInfo.getAddressCount();
    this.localNetwork = localNetwork;
}

From source file:org.csstudio.domain.common.net.GatewayUtil.java

public static boolean hasGateway() {
    boolean inSubnet = false;
    try {/* w  ww. j a  v a  2  s .  co  m*/
        final InetAddress localHost = InetAddress.getLocalHost();
        final String myAddress = localHost.getHostAddress();
        final List<SubnetUtils> controlSubnets = getControlSubnets();
        for (final SubnetUtils subnetUtils : controlSubnets) {
            inSubnet |= subnetUtils.getInfo().isInRange(myAddress);
        }
    } catch (final UnknownHostException e) {
        e.printStackTrace();
    } finally {
    }
    return !inSubnet;
}

From source file:org.dasein.cloud.openstack.nova.os.compute.NovaServer.java

protected @Nullable VirtualMachine toVirtualMachine(@Nullable JSONObject server,
        @Nonnull Iterable<IpAddress> ipv4, @Nonnull Iterable<IpAddress> ipv6, @Nonnull Iterable<VLAN> networks)
        throws JSONException, InternalException, CloudException {
    if (server == null) {
        return null;
    }/*w  ww.  j  a  va 2  s.  c o  m*/
    VirtualMachine vm = new VirtualMachine();
    String description = null;

    //        vm.setCurrentState(VmState.RUNNING);
    vm.setArchitecture(Architecture.I64);
    vm.setClonable(false);
    vm.setCreationTimestamp(-1L);
    vm.setImagable(false);
    vm.setLastBootTimestamp(-1L);
    vm.setLastPauseTimestamp(-1L);
    vm.setPausable(false);
    vm.setPersistent(true);
    vm.setPlatform(Platform.UNKNOWN);
    vm.setRebootable(true);
    vm.setProviderOwnerId(getTenantId());

    if (getCloudProvider().equals(OpenStackProvider.RACKSPACE)) {
        vm.setPersistent(false);
    }

    if (server.has("id")) {
        vm.setProviderVirtualMachineId(server.getString("id"));
    } else
        return null;
    if (server.has("name")) {
        vm.setName(server.getString("name"));
    }
    if (server.has("description") && !server.isNull("description")) {
        description = server.getString("description");
    }
    if (server.has("kernel_id")) {
        vm.setProviderKernelImageId(server.getString("kernel_id"));
    }
    if (server.has("ramdisk_id")) {
        vm.setProviderRamdiskImageId(server.getString("ramdisk_id"));
    }
    JSONObject md = (server.has("metadata") && !server.isNull("metadata")) ? server.getJSONObject("metadata")
            : null;

    Map<String, String> map = new HashMap<String, String>();
    boolean imaging = false;

    if (md != null) {
        if (md.has("org.dasein.description") && vm.getDescription() == null) {
            description = md.getString("org.dasein.description");
        } else if (md.has("Server Label")) {
            description = md.getString("Server Label");
        }
        if (md.has("org.dasein.platform")) {
            try {
                vm.setPlatform(Platform.valueOf(md.getString("org.dasein.platform")));
            } catch (Throwable ignore) {
                // ignore
            }
        }
        String[] keys = JSONObject.getNames(md);

        if (keys != null) {
            for (String key : keys) {
                String value = md.getString(key);

                if (value != null) {
                    map.put(key, value);
                }
            }
        }
    }
    if (server.has("OS-EXT-STS:task_state") && !server.isNull("OS-EXT-STS:task_state")) {
        String t = server.getString("OS-EXT-STS:task_state");

        map.put("OS-EXT-STS:task_state", t);
        imaging = t.equalsIgnoreCase("image_snapshot");
    }
    if (description == null) {
        if (vm.getName() == null) {
            vm.setName(vm.getProviderVirtualMachineId());
        }
        vm.setDescription(vm.getName());
    } else {
        vm.setDescription(description);
    }
    if (server.has("hostId")) {
        map.put("host", server.getString("hostId"));
    }
    vm.setTags(map);
    if (server.has("image") && !server.isNull("image")) {
        try {
            JSONObject img = server.getJSONObject("image");

            if (img.has("id")) {
                vm.setProviderMachineImageId(img.getString("id"));
            }
        } catch (JSONException ex) {
            logger.error("Unable to parse the image object");
            try {
                server.getString("image");
                logger.error(
                        "Image object has been returned as a string from cloud " + server.getString("image"));
            } catch (JSONException ignore) {
            }
        }
    }
    if (server.has("flavor")) {
        JSONObject f = server.getJSONObject("flavor");

        if (f.has("id")) {
            vm.setProductId(f.getString("id"));
        }
    } else if (server.has("flavorId")) {
        vm.setProductId(server.getString("flavorId"));
    }
    if (server.has("adminPass")) {
        vm.setRootPassword(server.getString("adminPass"));
    }
    if (server.has("key_name")) {
        vm.setProviderShellKeyIds(server.getString("key_name"));
    }
    if (server.has("status")) {
        String s = server.getString("status").toLowerCase();

        if (s.equals("active")) {
            vm.setCurrentState(VmState.RUNNING);
        } else if (s.startsWith("build")) {
            vm.setCurrentState(VmState.PENDING);
        } else if (s.equals("deleted")) {
            vm.setCurrentState(VmState.TERMINATED);
        } else if (s.equals("suspended")) {
            vm.setCurrentState(VmState.SUSPENDED);
        } else if (s.equalsIgnoreCase("paused")) {
            vm.setCurrentState(VmState.PAUSED);
        } else if (s.equalsIgnoreCase("stopped") || s.equalsIgnoreCase("shutoff")) {
            vm.setCurrentState(VmState.STOPPED);
        } else if (s.equalsIgnoreCase("stopping")) {
            vm.setCurrentState(VmState.STOPPING);
        } else if (s.equalsIgnoreCase("pausing")) {
            vm.setCurrentState(VmState.PAUSING);
        } else if (s.equalsIgnoreCase("suspending")) {
            vm.setCurrentState(VmState.SUSPENDING);
        } else if (s.equals("error")) {
            vm.setCurrentState(VmState.ERROR);
        } else if (s.equals("reboot") || s.equals("hard_reboot")) {
            vm.setCurrentState(VmState.REBOOTING);
        } else {
            logger.warn("toVirtualMachine(): Unknown server state: " + s);
            vm.setCurrentState(VmState.PENDING);
        }
    }
    if (vm.getCurrentState() == null && imaging) {
        vm.setCurrentState(VmState.PENDING);
    }
    if (server.has("created")) {
        vm.setCreationTimestamp(NovaOpenStack.parseTimestamp(server.getString("created")));
    }
    if (server.has("addresses")) {
        JSONObject addrs = server.getJSONObject("addresses");
        String[] names = JSONObject.getNames(addrs);

        if (names != null && names.length > 0) {
            List<RawAddress> pub = new ArrayList<RawAddress>();
            List<RawAddress> priv = new ArrayList<RawAddress>();

            for (String name : names) {
                JSONArray arr = addrs.getJSONArray(name);

                String subnet = null;
                for (int i = 0; i < arr.length(); i++) {
                    RawAddress addr = null;
                    String type = null;

                    if (getMinorVersion() == 0 && getMajorVersion() == 1) {
                        addr = new RawAddress(arr.getString(i).trim(), IPVersion.IPV4);
                    } else {
                        JSONObject a = arr.getJSONObject(i);
                        type = a.optString("OS-EXT-IPS:type");

                        if (a.has("version") && a.getInt("version") == 4 && a.has("addr")) {
                            subnet = a.getString("addr");
                            addr = new RawAddress(a.getString("addr"), IPVersion.IPV4);
                        } else if (a.has("version") && a.getInt("version") == 6 && a.has("addr")) {
                            subnet = a.getString("addr");
                            addr = new RawAddress(a.getString("addr"), IPVersion.IPV6);
                        }
                    }
                    if (addr != null) {
                        if ("public".equalsIgnoreCase(name) || "internet".equalsIgnoreCase(name)) {
                            pub.add(addr);
                        } else if ("floating".equalsIgnoreCase(type)) {
                            pub.add(addr);
                        } else if ("fixed".equalsIgnoreCase(type)) {
                            priv.add(addr);
                        } else if (addr.isPublicIpAddress()) {
                            pub.add(addr);
                        } else {
                            priv.add(addr);
                        }
                    }
                }
                if (vm.getProviderVlanId() == null) { // && !name.equals("public") && !name.equals("private") && !name.equals("nova_fixed") ) {
                    for (VLAN network : networks) {
                        if (network.getName().equals(name)) {
                            vm.setProviderVlanId(network.getProviderVlanId());
                            //get subnet
                            NetworkServices services = getProvider().getNetworkServices();
                            VLANSupport support = services.getVlanSupport();
                            Iterable<Subnet> subnets = support.listSubnets(network.getProviderVlanId());
                            for (Subnet sub : subnets) {
                                try {
                                    SubnetUtils utils = new SubnetUtils(sub.getCidr());

                                    if (utils.getInfo().isInRange(subnet)) {
                                        vm.setProviderSubnetId(sub.getProviderSubnetId());
                                        break;
                                    }
                                } catch (IllegalArgumentException arg) {
                                    logger.warn("Couldn't match against an invalid CIDR: " + sub.getCidr());
                                    continue;
                                }
                            }
                            break;
                        }
                    }
                }
            }
            vm.setPublicAddresses(pub.toArray(new RawAddress[pub.size()]));
            vm.setPrivateAddresses(priv.toArray(new RawAddress[priv.size()]));
        }
        RawAddress[] raw = vm.getPublicAddresses();

        if (raw != null) {
            for (RawAddress addr : vm.getPublicAddresses()) {
                if (addr.getVersion().equals(IPVersion.IPV4)) {
                    for (IpAddress a : ipv4) {
                        if (a.getRawAddress().getIpAddress().equals(addr.getIpAddress())) {
                            vm.setProviderAssignedIpAddressId(a.getProviderIpAddressId());
                            break;
                        }
                    }
                } else if (addr.getVersion().equals(IPVersion.IPV6)) {
                    for (IpAddress a : ipv6) {
                        if (a.getRawAddress().getIpAddress().equals(addr.getIpAddress())) {
                            vm.setProviderAssignedIpAddressId(a.getProviderIpAddressId());
                            break;
                        }
                    }
                }
            }
        }
        if (vm.getProviderAssignedIpAddressId() == null) {
            for (IpAddress addr : ipv4) {
                String serverId = addr.getServerId();

                if (serverId != null && serverId.equals(vm.getProviderVirtualMachineId())) {
                    vm.setProviderAssignedIpAddressId(addr.getProviderIpAddressId());
                    break;
                }
            }
            if (vm.getProviderAssignedIpAddressId() == null) {
                for (IpAddress addr : ipv6) {
                    String serverId = addr.getServerId();

                    if (serverId != null && addr.getServerId().equals(vm.getProviderVirtualMachineId())) {
                        vm.setProviderAssignedIpAddressId(addr.getProviderIpAddressId());
                        break;
                    }
                }
            }
        }
        if (vm.getProviderAssignedIpAddressId() == null) {
            for (IpAddress addr : ipv6) {
                if (addr.getServerId().equals(vm.getProviderVirtualMachineId())) {
                    vm.setProviderAssignedIpAddressId(addr.getProviderIpAddressId());
                    break;
                }
            }
        }
    }
    vm.setProviderRegionId(getRegionId());
    vm.setProviderDataCenterId(vm.getProviderRegionId() + "-a");
    vm.setTerminationTimestamp(-1L);
    if (vm.getName() == null) {
        vm.setName(vm.getProviderVirtualMachineId());
    }
    if (vm.getDescription() == null) {
        vm.setDescription(vm.getName());
    }

    if (Platform.UNKNOWN.equals(vm.getPlatform())) {
        vm.setPlatform(getPlatform(vm.getName(), vm.getDescription(), vm.getProviderMachineImageId()));
    }
    vm.setImagable(vm.getCurrentState() == null);
    vm.setRebootable(vm.getCurrentState() == null);

    if (getCloudProvider().equals(OpenStackProvider.RACKSPACE)) {
        //Rackspace does not support the concept for firewalls in servers
        vm.setProviderFirewallIds(null);
    } else {
        Iterable<String> fwIds = listFirewalls(vm.getProviderVirtualMachineId(), server);
        int count = 0;

        //noinspection UnusedDeclaration
        for (String id : fwIds) {
            count++;
        }
        String[] ids = new String[count];
        int i = 0;

        for (String id : fwIds) {
            ids[i++] = id;
        }
        vm.setProviderFirewallIds(ids);
    }
    return vm;
}