http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Network.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Network.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Network.java new file mode 100644 index 0000000..0759c5a --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Network.java @@ -0,0 +1,331 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +public class Network extends OvmObject { + private static final Logger LOGGER = Logger.getLogger(Network.class); + private static final String START = "start"; + private static final String BRIDGE = "Bridge"; + private static final String ADDRESS = "Address"; + private static final String PHYSICAL = "Physical"; + private Map<String, Interface> interfaceList = null; + private Object postDiscovery = null; + private List<String> netInterfaces = new ArrayList<String>(); + + public Network(Connection c) { + setClient(c); + } + + public Map<String, Interface> getInterfaceList() + throws Ovm3ResourceException { + discoverNetwork(); + return interfaceList; + } + + public static class Interface { + private final Map<String, String> iFace = new HashMap<String, String>() { + { + put("Type", null); + put(PHYSICAL, null); + put("Name", null); + put(ADDRESS, null); + put("Broadcast", null); + put("MAC", null); + put("Vlan", null); + } + }; + + public Interface() { + } + + public void setIfType(String t) { + iFace.put("Type", t); + } + + public String getIfType() { + return iFace.get("Type"); + } + + public void setInterface(Map<String, String> itf) { + iFace.putAll(itf); + } + + public String getName() { + return iFace.get("Name"); + } + + public String getPhysical() { + return iFace.get(PHYSICAL); + } + + public String getAddress() { + return iFace.get(ADDRESS); + } + + public String getBroadcast() { + return iFace.get("Broadcast"); + } + + public String getMac() { + return iFace.get("MAC"); + } + + public String setName(String name) { + return iFace.put("Name", name); + } + + public String setPhysical(String ph) { + return iFace.put(PHYSICAL, ph); + } + + public String setMac(String mac) { + return iFace.put("MAC", mac); + } + } + + private Network.Interface getNetIface(String key, String val) + throws Ovm3ResourceException { + Map<String, Network.Interface> ifaces = getInterfaceList(); + for (final Entry<String, Interface> iface : ifaces.entrySet()) { + String match = "default"; + if (ADDRESS.equals(key)) { + match = iface.getValue().getAddress(); + } + if ("Name".equals(key)) { + match = iface.getKey(); + } + if (match != null && match.equals(val)) { + return iface.getValue(); + } + } + LOGGER.debug("Unable to find " + key + " Interface by value: " + val); + setSuccess(false); + return null; + } + + public Network.Interface getInterfaceByIp(String ip) + throws Ovm3ResourceException { + return getNetIface(ADDRESS, ip); + } + + public Network.Interface getInterfaceByName(String name) + throws Ovm3ResourceException { + return getNetIface("Name", name); + } + + /* check if it is a BRIDGE */ + public String getPhysicalByBridgeName(String name) + throws Ovm3ResourceException { + return getInterfaceByName(name).getPhysical(); + } + + public Network.Interface getBridgeByName(String name) + throws Ovm3ResourceException { + if (getNetIface("Name", name) != null + && getNetIface("Name", name).getIfType().contentEquals(BRIDGE)) { + return getNetIface("Name", name); + } + LOGGER.debug("Unable to find bridge by name: " + name); + setSuccess(false); + return null; + } + + public Network.Interface getBridgeByIp(String ip) + throws Ovm3ResourceException { + if (getNetIface(ADDRESS, ip) != null + && getNetIface(ADDRESS, ip).getIfType().contentEquals(BRIDGE)) { + return getNetIface(ADDRESS, ip); + } + LOGGER.debug("Unable to find bridge by ip: " + ip); + setSuccess(false); + return null; + } + + /* + * configure_virtual_ip, <class + * 'agent.api.network.linux_network.LinuxNetwork'> argument: self - default: + * None argument: virtual_ip - default: None argument: base_ip - default: + * None + */ + public Boolean configureVip(String vip, String baseip) + throws Ovm3ResourceException { + return nullIsTrueCallWrapper("configure_virtual_ip", vip, baseip); + } + + public Boolean ovsIpConfig(String net, String optype, String ip, + String netmask) throws Ovm3ResourceException { + return nullIsTrueCallWrapper("ovs_ip_config", net, optype, ip, netmask); + } + + /* + * Restriction: - data string that starts with leading spaces will be + * rejected ovs_if_meta('bond0', + * 'ethernet:c0a80100{192.168.1.0}:MANAGEMENT,CLUSTER_HEARTBEAT,LIVE_MIGRATE,VIRTUAL_MACHINE,STORAGE') + */ + + public Boolean discoverNetwork() throws Ovm3ResourceException { + postDiscovery = callWrapper("discover_network"); + if (postDiscovery == null) { + return false; + } + interfaceList = new HashMap<String, Interface>(); + Document xmlDocument = prepParse((String) postDiscovery); + String path = "//Discover_Network_Result/Network/Active"; + String bpath = path + "/Bridges/Device"; + + netInterfaces = new ArrayList<String>(); + netInterfaces.addAll(xmlToList(bpath + "/@Name", xmlDocument)); + for (String b : netInterfaces) { + Map<String, String> br = xmlToMap(bpath + "[@Name='" + b + + "']/Family", xmlDocument); + /* vifs are here too */ + String phyInt = (String) this.xmlToMap( + bpath + "[@Name='" + b + "']/Interfaces", xmlDocument).get( + "PhyInterface"); + Interface iface = new Interface(); + iface.setInterface(br); + iface.setName(b); + iface.setIfType(BRIDGE); + if (phyInt == null) { + iface.setIfType("Local"); + } + iface.setPhysical(phyInt); + interfaceList.put(b, iface); + } + /* add "physical" interfaces */ + bpath = path + "/Network/Device"; + netInterfaces = new ArrayList<String>(); + netInterfaces.addAll(xmlToList(bpath + "/@Name", xmlDocument)); + for (String p : netInterfaces) { + Map<String, String> nf = xmlToMap("//Device[@Name='" + p + "']", + xmlDocument); + Interface iface = new Interface(); + iface.setPhysical(nf.get("Basename")); + iface.setName(p); + iface.setMac(nf.get("MAC")); + iface.setIfType(PHYSICAL); + interfaceList.put(p, iface); + } + /* add virtual interfaces ? */ + return true; + } + + public Boolean startOvsLocalConfig(String br) throws Ovm3ResourceException { + String s = (String) ovsLocalConfig(START, br); + if (s.startsWith(START)) { + return true; + } + return false; + } + + public Boolean stopOvsLocalConfig(String br) throws Ovm3ResourceException { + String s = (String) ovsLocalConfig("stop", br); + if (s.startsWith("stop")) { + return true; + } + return false; + } + + private Object ovsLocalConfig(String action, String br) + throws Ovm3ResourceException { + return callWrapper("ovs_local_config", action, br); + } + + public Boolean startOvsVlanConfig(String dev, int vlan) + throws Ovm3ResourceException { + return ovsVlanConfig("add", dev, vlan); + } + + public Boolean stopOvsVlanConfig(String dev, int vlan) + throws Ovm3ResourceException { + return ovsVlanConfig("remove", dev, vlan); + } + + private Boolean ovsVlanConfig(String action, String net, int vlan) + throws Ovm3ResourceException { + Object x = callWrapper("ovs_vlan_config", action, net, vlan); + if (x == null) { + return true; + } + return false; + } + + public Boolean startOvsBrConfig(String br, String dev) + throws Ovm3ResourceException { + String s = (String) ovsBrConfig(START, br, dev); + if (s.startsWith(START)) { + return true; + } + return false; + } + + public Boolean stopOvsBrConfig(String br, String dev) + throws Ovm3ResourceException { + String s = (String) ovsBrConfig("stop", br, dev); + if (s.startsWith("stop")) { + return true; + } + return false; + } + + public Object ovsBrConfig(String action, String br, String net) + throws Ovm3ResourceException { + return (Object) callWrapper("ovs_br_config", action, br, net); + } + + /* 1 is untagged, goes till 4095 */ + public Boolean stopOvsVlanBridge(String br, String net, int vlan) + throws Ovm3ResourceException { + String s = (String) ovsVlanBridge("stop", br, net, vlan); + if (s.startsWith("stop")) { + return true; + } + return false; + } + + public Boolean startOvsVlanBridge(String br, String net, int vlan) + throws Ovm3ResourceException { + String s = (String) ovsVlanBridge(START, br, net, vlan); + /* 3.2.1 uses start, 3.3.1 and up uses added... */ + if (s.startsWith(START) || s.startsWith("Added")) { + return true; + } + return false; + } + + private Object ovsVlanBridge(String action, String br, String net, int vlan) + throws Ovm3ResourceException { + return (Object) callWrapper("ovs_vlan_bridge", action, br, net, vlan); + } + + /* + * deconfigure_virtual_ip, <class + * 'agent.api.network.linux_network.LinuxNetwork'> argument: self - default: + * None argument: virtual_ip - default: None + */ +}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ntp.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ntp.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ntp.java new file mode 100644 index 0000000..2402bf5 --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ntp.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import java.util.ArrayList; +import java.util.List; + +public class Ntp extends OvmObject { + private List<String> ntpHosts = new ArrayList<String>(); + private Boolean isServer = null; + private Boolean isRunning = null; + + public Ntp(Connection c) { + setClient(c); + } + + public List<String> addServer(String server) { + if (!ntpHosts.contains(server)) { + ntpHosts.add(server); + } + return ntpHosts; + } + + public List<String> removeServer(String server) { + if (ntpHosts.contains(server)) { + ntpHosts.remove(server); + } + return ntpHosts; + } + + public List<String> getServers() { + return ntpHosts; + } + public void setServers(List<String> s) { + ntpHosts = s; + } + + public Boolean isRunning() { + return isRunning; + } + + public Boolean isServer() { + return isServer; + } + + public Boolean getDetails() throws Ovm3ResourceException { + return getNtp(); + } + + /* + * get_ntp, <class 'agent.api.host.linux.Linux'> argument: self - default: + * None + */ + public Boolean getNtp() throws Ovm3ResourceException { + Object[] v = (Object[]) callWrapper("get_ntp"); + int c = 0; + for (Object o : v) { + if (o instanceof java.lang.Boolean) { + if (c == 0) { + isServer = (Boolean) o; + } + if (c == 1) { + isRunning = (Boolean) o; + } + c += 1; + } else if (o instanceof java.lang.Object) { + Object[] s = (Object[]) o; + for (Object m : s) { + addServer((String) m); + } + } + } + return true; + } + + public Boolean setNtp(List<String> ntpHosts, Boolean running) + throws Ovm3ResourceException { + if (ntpHosts.isEmpty()) { + return false; + } + return nullIsTrueCallWrapper("set_ntp", ntpHosts, running); + } + + /* also cleans the vector */ + public Boolean setNtp(String server, Boolean running) + throws Ovm3ResourceException { + ntpHosts = new ArrayList<String>(); + ntpHosts.add(server); + return setNtp(ntpHosts, running); + } + + public Boolean setNtp(Boolean running) throws Ovm3ResourceException { + return setNtp(ntpHosts, running); + } + + public Boolean disableNtp() throws Ovm3ResourceException { + return nullIsTrueCallWrapper("disable_ntp"); + + } + + public Boolean enableNtp() throws Ovm3ResourceException { + return nullIsTrueCallWrapper("enable_ntp"); + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ovm3ResourceException.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ovm3ResourceException.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ovm3ResourceException.java new file mode 100644 index 0000000..a04a242 --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Ovm3ResourceException.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +public class Ovm3ResourceException extends Exception { + private static final long serialVersionUID = 1L; + private static final Throwable CAUSE = null; + public Ovm3ResourceException() { + super(); + } + + public Ovm3ResourceException(String message) { + super(message); + } + + public Ovm3ResourceException(String message, Throwable cause) { + super(message, cause); + } + + @Override + public Throwable getCause() { + return CAUSE; + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/OvmObject.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/OvmObject.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/OvmObject.java new file mode 100644 index 0000000..32bd12a --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/OvmObject.java @@ -0,0 +1,247 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.apache.log4j.Logger; +import org.apache.xmlrpc.XmlRpcException; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class OvmObject { + private volatile Connection client; + private static List<?> emptyParams = new ArrayList<Object>(); + private static final Logger LOGGER = Logger + .getLogger(OvmObject.class); + private boolean success = false; + + public OvmObject() { + } + + public Connection getClient() { + return client; + } + + public synchronized void setClient(Connection c) { + client = c; + } + + /* remove dashes from uuids */ + public String deDash(String str) { + return str.replaceAll("-", ""); + } + /* generate a uuid */ + public String newUuid() { + return UUID.randomUUID().toString(); + } + + /* generate a uuid */ + public String newUuid(String str) { + return UUID.nameUUIDFromBytes(str.getBytes()).toString(); + } + + /* capture most of the calls here */ + public Object callWrapper(String call) throws Ovm3ResourceException { + try { + return client.call(call, emptyParams); + } catch (XmlRpcException e) { + String msg = "Client call " + call + " to " + client.getIp() + " went wrong: " + e.getMessage(); + throw new Ovm3ResourceException(msg, e); + } + } + + public void setSuccess(boolean s) { + success = s; + } + + public Boolean getSuccess() { + return success; + } + + /* nice try but doesn't work like that .. */ + @SafeVarargs + public final <T> Object callWrapper(String call, T... args) + throws Ovm3ResourceException { + List<T> params = new ArrayList<T>(); + for (T param : args) { + params.add(param); + } + try { + return client.call(call, params); + } catch (XmlRpcException e) { + String msg = "Client call " + call + " to " + client.getIp() + " with " + params + " went wrong: " + e.getMessage(); + throw new Ovm3ResourceException(msg, e); + } + } + + /* should check on nil ? */ + @SafeVarargs + public final <T> Boolean nullCallWrapper(String call, Boolean nullReturn, T... args) throws Ovm3ResourceException { + Object x = callWrapper(call, args); + if (x == null) { + return nullReturn; + } else if (!nullReturn) { + return true; + } + return false; + } + + @SafeVarargs + public final <T> Boolean nullIsFalseCallWrapper(String call, T... args) throws Ovm3ResourceException { + return nullCallWrapper(call, false, args); + } + @SafeVarargs + public final <T> Boolean nullIsTrueCallWrapper(String call, T... args) throws Ovm3ResourceException { + return nullCallWrapper(call, true, args); + } + + /* returns a single string */ + public Map<String, Long> callMap(String call) throws Ovm3ResourceException { + return (HashMap<String, Long>) callWrapper(call); + } + + public <T> String callString(String call, T... args) throws Ovm3ResourceException { + Object result = callWrapper(call, args); + if (result == null) { + return null; + } + if (result instanceof String || result instanceof Integer || result instanceof Long || result instanceof HashMap) { + return result.toString(); + } + + Object[] results = (Object[]) result; + + if (results.length == 0) { + return null; + } + if (results.length == 1) { + return results[0].toString(); + } + return null; + } + + /* was String, Object before */ + public <E> Map<String, E> xmlToMap(String path, Document xmlDocument) + throws Ovm3ResourceException { + XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance(); + XPath xPath = factory.newXPath(); + try { + XPathExpression xPathExpression = xPath.compile(path); + NodeList nodeList = (NodeList) xPathExpression.evaluate(xmlDocument, + XPathConstants.NODESET); + Map<String, E> myMap = new HashMap<String, E>(); + for (int ind = 0; ind < nodeList.getLength(); ind++) { + NodeList nodeListFor = nodeList.item(ind).getChildNodes(); + for (int index = 0; index < nodeListFor.getLength(); index++) { + String rnode = nodeListFor.item(index).getNodeName(); + NodeList nodeListFor2 = nodeListFor.item(index).getChildNodes(); + if (nodeListFor2.getLength() > 1) { + /* Do we need to figure out all the sub elements here and put them in a map? */ + } else { + String element = nodeListFor.item(index).getTextContent(); + myMap.put(rnode, (E) element); + } + } + } + return myMap; + } catch (XPathExpressionException e) { + throw new Ovm3ResourceException("Problem parsing XML to Map:", e); + } + } + + public List<String> xmlToList(String path, Document xmlDocument) + throws Ovm3ResourceException { + List<String> list = new ArrayList<String>(); + XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance(); + XPath xPath = factory.newXPath(); + try { + XPathExpression xPathExpression = xPath.compile(path); + NodeList nodeList = (NodeList) xPathExpression.evaluate(xmlDocument, + XPathConstants.NODESET); + for (int ind = 0; ind < nodeList.getLength(); ind++) { + if (!nodeList.item(ind).getTextContent().isEmpty()) { + list.add("" + nodeList.item(ind).getTextContent()); + } else { + list.add("" + nodeList.item(ind).getNodeValue()); + } + } + return list; + } catch (XPathExpressionException e) { + throw new Ovm3ResourceException("Problem parsing XML to List: ", e); + } + } + + public String xmlToString(String path, Document xmlDocument) + throws Ovm3ResourceException { + XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance(); + XPath xPath = factory.newXPath(); + try { + XPathExpression xPathExpression = xPath.compile(path); + NodeList nodeList = (NodeList) xPathExpression.evaluate(xmlDocument, + XPathConstants.NODESET); + return nodeList.item(0).getTextContent(); + } catch (NullPointerException e) { + LOGGER.info("Got no items back from parsing, returning null: " + e); + return null; + } catch (XPathExpressionException e) { + throw new Ovm3ResourceException("Problem parsing XML to String: ", e); + } + } + + public Document prepParse(String input) + throws Ovm3ResourceException { + DocumentBuilderFactory builderfactory = DocumentBuilderFactory + .newInstance(); + builderfactory.setNamespaceAware(true); + + DocumentBuilder builder; + try { + builder = builderfactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new Ovm3ResourceException("Unable to create document Builder: ", e); + } + Document xmlDocument; + try { + xmlDocument = builder.parse(new InputSource(new StringReader( + input))); + } catch (SAXException | IOException e) { + LOGGER.info(e.getClass() + ": ", e); + throw new Ovm3ResourceException("Unable to parse XML: ", e); + } + return xmlDocument; + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Pool.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Pool.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Pool.java new file mode 100644 index 0000000..84fa965 --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Pool.java @@ -0,0 +1,272 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +/* + * synonym to the pool python lib in the ovs-agent + */ +public class Pool extends OvmObject { + private static final Logger LOGGER = Logger + .getLogger(Pool.class); + + private final List<String> validRoles = new ArrayList<String>() { + { + add("xen"); + add("utility"); + } + }; + private List<String> poolHosts = new ArrayList<String>(); + private final List<String> poolRoles = new ArrayList<String>(); + private String poolMasterVip; + private String poolAlias; + private String poolId = null; + + public Pool(Connection c) { + setClient(c); + } + + public String getPoolMasterVip() { + return poolMasterVip; + } + + public String getPoolAlias() { + return poolAlias; + } + + public String getPoolId() { + return poolId; + } + + public List<String> getValidRoles() { + return validRoles; + } + + public Boolean isInPool(String id) throws Ovm3ResourceException { + if (poolId == null) { + discoverServerPool(); + } + if (poolId == null) { + return false; + } + if (isInAPool() && poolId.equals(id)) { + return true; + } + return false; + } + + public Boolean isInAPool() throws Ovm3ResourceException { + if (poolId == null) { + discoverServerPool(); + } + if (poolId == null) { + return false; + } + return true; + } + + private Boolean createServerPool(String alias, String id, String vip, + int num, String name, String host, List<String> roles) throws Ovm3ResourceException{ + String role = StringUtils.join(roles, ","); + if (!isInAPool()) { + Object x = callWrapper("create_server_pool", alias, id, vip, num, name, + host, role); + if (x == null) { + return true; + } + return false; + } else if (isInPool(id)) { + return true; + } else { + throw new Ovm3ResourceException("Unable to add host is already in a pool with id : " + poolId); + } + } + + public Boolean createServerPool(String alias, String id, String vip, + int num, String name, String ip) throws Ovm3ResourceException { + return createServerPool(alias, id, vip, num, name, ip, + getValidRoles()); + } + + /* + * public Boolean updatePoolVirtualIp(String ip) throws + * Ovm3ResourceException { Object x = callWrapper("update_pool_virtual_ip", + * ip); if (x == null) { poolMasterVip = ip; return true; } return false; } + */ + + public Boolean leaveServerPool(String uuid) throws Ovm3ResourceException{ + return nullIsTrueCallWrapper("leave_server_pool", uuid); + } + /** + * Ownership prior to 3.3.x used to be simpler.... + * @param uuid + * @param apiurl + * @return + * @throws Ovm3ResourceException + */ + public Boolean takeOwnership(String uuid, String apiurl) throws Ovm3ResourceException { + return nullIsTrueCallWrapper("take_ownership", uuid, apiurl); + } + /** + * New style ownership, we need a dict to go in. + * manager_uuid + * manager_event_url + * manager_statistic_url + * manager_certificate + * signed_server_certificate + * @param uuid + * @param apiurl + * @return + * @throws Ovm3ResourceException + */ + public Boolean takeOwnership33x(final String uuid, + final String eventUrl, + final String statUrl, + final String managerCert, + final String signedCert) throws Ovm3ResourceException { + final Map<String, String> mgrConfig = new HashMap<String, String>() { + { + put("manager_uuid", uuid); + put("manager_event_url", eventUrl); + put("manager_statistic_url", statUrl); + put("manager_certificate", managerCert); + put("signed_server_certificate", signedCert); + } + }; + Boolean rc = nullIsTrueCallWrapper("take_ownership", mgrConfig); + /* because it restarts when it's done.... 2000? -sigh- */ + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new Ovm3ResourceException(e.getMessage()); + } + return rc; + } + + /* + * destroy_server_pool, <class 'agent.api.serverpool.ServerPool'> argument: + * self - default: None argument: pool_uuid - default: None + */ + public Boolean destroyServerPool(String uuid) throws Ovm3ResourceException{ + return nullIsTrueCallWrapper("destroy_server_pool", uuid); + } + + /* + * release_ownership, <class 'agent.api.serverpool.ServerPool'> argument: + * self - default: None argument: manager_uuid - default: None + */ + public Boolean releaseOwnership(String uuid) throws Ovm3ResourceException{ + return nullIsTrueCallWrapper("release_ownership", uuid); + } + + /* server.discover_pool_filesystem */ + /* + * discover_server_pool, <class 'agent.api.serverpool.ServerPool'> argument: + * self - default: None + */ + public Boolean discoverServerPool() throws Ovm3ResourceException { + Object x = callWrapper("discover_server_pool"); + if (x == null) { + return false; + } + + Document xmlDocument = prepParse((String) x); + String path = "//Discover_Server_Pool_Result/Server_Pool"; + poolId = xmlToString(path + "/Unique_Id", xmlDocument); + poolAlias = xmlToString(path + "/Pool_Alias", xmlDocument); + poolMasterVip = xmlToString(path + "/Master_Virtual_Ip", + xmlDocument); + poolHosts.addAll(xmlToList(path + "//Registered_IP", xmlDocument)); + if (poolId == null) { + return false; + } + return true; + } + + private Boolean setServerRoles() throws Ovm3ResourceException{ + String roles = StringUtils.join(poolRoles.toArray(), ","); + return nullIsTrueCallWrapper("update_server_roles", roles); + } + + /* do some sanity check on the valid poolroles */ + public Boolean setServerRoles(List<String> roles) throws Ovm3ResourceException { + poolRoles.addAll(roles); + return setServerRoles(); + } + + private Boolean joinServerPool(String alias, String id, String vip, int num, + String name, String host, List<String> roles) throws Ovm3ResourceException{ + String role = StringUtils.join(roles.toArray(), ","); + if (!isInAPool()) { + Object x = callWrapper("join_server_pool", alias, id, vip, num, name, + host, role); + if (x == null) { + return true; + } + return false; + } else if (isInPool(id)) { + return true; + } else { + throw new Ovm3ResourceException("Unable to add host is already in a pool with id : " + poolId); + } + } + + public Boolean joinServerPool(String alias, String id, String vip, int num, + String name, String host) throws Ovm3ResourceException { + return joinServerPool(alias, id, vip, num, name, host, getValidRoles()); + } + + private Boolean setPoolMemberList() throws Ovm3ResourceException { + // should throw exception if no poolHosts set + return nullIsTrueCallWrapper("set_pool_member_ip_list", poolHosts); + } + + public List<String> getPoolMemberList() throws Ovm3ResourceException { + if (poolId == null) { + discoverServerPool(); + } + return poolHosts; + } + + public Boolean setPoolMemberList(List<String> hosts) throws Ovm3ResourceException { + poolHosts = new ArrayList<String>(); + poolHosts.addAll(hosts); + return setPoolMemberList(); + } + + public Boolean addPoolMember(String host) throws Ovm3ResourceException { + getPoolMemberList(); + poolHosts.add(host); + return setPoolMemberList(); + } + + public Boolean removePoolMember(String host) throws Ovm3ResourceException { + getPoolMemberList(); + poolHosts.remove(host); + return setPoolMemberList(); + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/PoolOCFS2.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/PoolOCFS2.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/PoolOCFS2.java new file mode 100644 index 0000000..c5425ac --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/PoolOCFS2.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +public class PoolOCFS2 extends OvmObject { + private static final Logger LOGGER = Logger + .getLogger(PoolOCFS2.class); + private Map<String, String> poolFileSystem = new HashMap<String, String>(); + private String poolFsTarget; + private String poolFsType; + private String poolFsNFSBaseId; + private String poolFsId; + private String poolFsVersion; + private String poolFsManagerUuid; + private String poolPoolFsId; + + public PoolOCFS2(Connection c) { + setClient(c); + } + + public String getPoolFsNFSBaseId() { + return poolFsNFSBaseId; + } + + public String getPoolFsId() { + return poolFsId; + } + + public String getPoolFsUuid() { + return poolFsId; + } + + public String getPoolFsTarget() { + return poolFsTarget; + } + public String getPoolFsManagerUuid() { + return poolFsManagerUuid; + } + public String getPoolFsVersion() { + return poolFsVersion; + } + public String getPoolPoolFsId() { + return poolPoolFsId; + } + public String getPoolFsType() { + return poolFsType; + } + public Boolean hasPoolFs(String id) throws Ovm3ResourceException { + if (poolFsId == null) { + discoverPoolFs(); + } + if (hasAPoolFs() && poolFsId.equals(id)) { + return true; + } + return false; + } + public Boolean hasAPoolFs() throws Ovm3ResourceException { + if (poolFsId == null) { + discoverPoolFs(); + } + if (poolFsId == null) { + return false; + } + return true; + } + + public Boolean destroyPoolFs(String type, String target, String uuid, + String nfsbaseuuid) throws Ovm3ResourceException { + // should throw exception if no poolIps set + return nullIsTrueCallWrapper("destroy_pool_filesystem", type, target, uuid, + nfsbaseuuid); + } + + public Boolean destroyPoolFs() throws Ovm3ResourceException { + // should throw exception if no poolIps set + return nullIsTrueCallWrapper("destroy_pool_filesystem", poolFsType, + poolFsTarget, poolFsId, poolFsNFSBaseId); + } + + public Boolean createPoolFs(String type, String target, String clustername, + String fsid, String nfsbaseid, String managerid) throws Ovm3ResourceException { + if (!hasAPoolFs()) { + return nullIsTrueCallWrapper("create_pool_filesystem", type, target, + clustername, fsid, nfsbaseid, managerid, fsid); + } else if (hasPoolFs(fsid)) { + LOGGER.debug("PoolFs already exists on this host: " + fsid); + return true; + } else { + throw new Ovm3ResourceException("Unable to add pool filesystem to host, "+ + "pool filesystem with other id found: " + poolFsId); + } + } + + /* Assume a single pool can be used for a host... */ + public Boolean discoverPoolFs() throws Ovm3ResourceException{ + // should throw exception if no poolIps set + Object x = callWrapper("discover_pool_filesystem"); + if (x == null) { + return false; + } + Document xmlDocument = prepParse((String) x); + String path = "//Discover_Pool_Filesystem_Result"; + poolFileSystem = xmlToMap(path + "/Pool_Filesystem", xmlDocument); + poolFsTarget = poolFileSystem.get("Pool_Filesystem_Target"); + poolFsType = poolFileSystem.get("Pool_Filesystem_Type"); + poolFsNFSBaseId = poolFileSystem.get("Pool_Filesystem_Nfsbase_Uuid"); + poolFsId = poolFileSystem.get("Pool_Filesystem_Uuid"); + poolPoolFsId = poolFileSystem.get("Pool_Filesystem_Pool_Uuid"); + poolFsManagerUuid = poolFileSystem.get("Pool_Filesystem_Manager_Uuid"); + poolFsVersion = poolFileSystem.get("Pool_Filesystem_Version"); + return true; + } + + public Boolean ocfs2GetMetaData(String device, String filename) throws Ovm3ResourceException { + Object x = callWrapper("ocfs2_get_meta_data", device, filename); + if (x == null) { + return true; + } + return false; + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Remote.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Remote.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Remote.java new file mode 100644 index 0000000..adfa239 --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Remote.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +public class Remote extends OvmObject { + + public Remote(Connection c) { + setClient(c); + } + + public Boolean sysShutdown() throws Ovm3ResourceException { + return nullIsTrueCallWrapper("sys_shutdown"); + } + + public Boolean sysReboot() throws Ovm3ResourceException { + return nullIsTrueCallWrapper("sys_reboot"); + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Repository.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Repository.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Repository.java new file mode 100644 index 0000000..7e842ce --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/Repository.java @@ -0,0 +1,334 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +public class Repository extends OvmObject { + private static final Logger LOGGER = Logger.getLogger(Repository.class); + private static final String VERSION = "Version"; + private static final String NAMETAG = "[@Name='"; + private Object postDiscovery = null; + private Object postDbDiscovery = null; + private Map<String, RepoDbDetails> repoDbs = new HashMap<String, RepoDbDetails>(); + private Map<String, RepoDetails> repos = new HashMap<String, RepoDetails>(); + private List<String> repoDbList = new ArrayList<String>(); + private List<String> repoList = new ArrayList<String>(); + + public Repository(Connection c) { + setClient(c); + } + + public RepoDbDetails getRepoDb(String id) throws Ovm3ResourceException { + if (repoDbs.containsKey(id)) { + return repoDbs.get(id); + } + return null; + } + + public List<String> getRepoDbList() throws Ovm3ResourceException { + return repoDbList; + } + + public RepoDetails getRepo(String id) throws Ovm3ResourceException { + if (repos.containsKey(id)) { + return repos.get(id); + } + return null; + } + + public List<String> getRepoList() throws Ovm3ResourceException { + return repoList; + } + + public static class RepoDbDetails { + private final Map<String, String> dbEntry = new HashMap<String, String>() { + { + put("Uuid", null); + put("Fs_location", null); + put("Mount_point", null); + put("Filesystem_type", null); + put(VERSION, null); + put("Alias", null); + put("Manager_uuid", null); + put("Status", null); + } + }; + + public RepoDbDetails() { + } + + public void setRepoDbDetails(Map<String, String> det) { + dbEntry.putAll(det); + } + + public void setUuid(String id) { + dbEntry.put("Uuid", id); + } + + public String getStatus() { + return dbEntry.get("Status"); + } + + public String getManagerUuid() { + return dbEntry.get("Manager_uuid"); + } + + public String getAlias() { + return dbEntry.get("Alias"); + } + + public String getVersion() { + return dbEntry.get(VERSION); + } + + public String getFilesystemType() { + return dbEntry.get("Filesystem_type"); + } + + public String getMountPoint() { + return dbEntry.get("Mount_point"); + } + + public String getFsLocation() { + return dbEntry.get("Fs_location"); + } + + public String getUuid() { + return dbEntry.get("Uuid"); + } + + } + + public static class RepoDetails { + private List<String> templates = new ArrayList<String>(); + private List<String> virtualMachines = new ArrayList<String>(); + private List<String> virtualDisks = new ArrayList<String>(); + private List<String> isos = new ArrayList<String>(); + private final Map<String, String> dbEntry = new HashMap<String, String>() { + { + put("Repository_UUID", null); + put(VERSION, null); + put("Repository_Alias", null); + put("Manager_UUID", null); + } + }; + + public RepoDetails() { + } + + public String getManagerUuid() { + return dbEntry.get("Manager_UUID"); + } + + public String getAlias() { + return dbEntry.get("Repository_Alias"); + } + + public String getVersion() { + return dbEntry.get(VERSION); + } + + public String getUuid() { + return dbEntry.get("Repository_UUID"); + } + + public void setRepoDetails(Map<String, String> det) { + dbEntry.putAll(det); + } + + public void setRepoTemplates(List<String> temp) { + templates.addAll(temp); + } + + public List<String> getRepoTemplates() { + return templates; + } + + public void setRepoVirtualMachines(List<String> vms) { + virtualMachines.addAll(vms); + } + + public List<String> getRepoVirtualMachines() { + return virtualMachines; + } + + public void setRepoVirtualDisks(List<String> disks) { + virtualDisks.addAll(disks); + } + + public List<String> getRepoVirtualDisks() { + return virtualDisks; + } + + public void setRepoISOs(List<String> isolist) { + isos.addAll(isolist); + } + + public List<String> getRepoISOs() { + return isos; + } + } + + /* + * delete_repository, <class 'agent.api.repository.Repository'> argument: + * repo_uuid - default: None argument: erase - default: None + */ + public Boolean deleteRepo(String id, Boolean erase) + throws Ovm3ResourceException { + Object res = callWrapper("delete_repository", id, erase); + if (res == null) { + return true; + } + return false; + } + + /* + * import_virtual_disk, <class 'agent.api.repository.Repository'> argument: + * url - default: None argument: virtual_disk_id - default: None argument: + * repo_uuid - default: None argument: option - default: None + */ + /* should add timeout ? */ + public Boolean importVirtualDisk(String url, String vdiskid, String repoid, + String option) throws Ovm3ResourceException { + return nullIsTrueCallWrapper("import_virtual_disk", url, vdiskid, + repoid, option); + } + + public Boolean importVirtualDisk(String url, String vdiskid, String repoid) + throws Ovm3ResourceException { + return nullIsTrueCallWrapper("import_virtual_disk", url, vdiskid, + repoid); + } + + /* + * discover_repositories, <class 'agent.api.repository.Repository'> + * argument: args - default: None + */ + /* + * args are repo ids <Discover_Repositories_Result> <RepositoryList/> + * </Discover_Repositories_Result> + */ + public Boolean discoverRepo(String id) throws Ovm3ResourceException { + postDiscovery = callWrapper("discover_repositories", id); + if (postDiscovery == null) { + return false; + } + Document xmlDocument = prepParse((String) postDiscovery); + String path = "//Discover_Repositories_Result/RepositoryList/Repository"; + repoList = new ArrayList<String>(); + repoList.addAll(xmlToList(path + "/@Name", xmlDocument)); + for (String name : repoList) { + RepoDetails repo = new RepoDetails(); + repo.setRepoTemplates(xmlToList(path + NAMETAG + id + + "']/Templates/Template/File", xmlDocument)); + repo.setRepoVirtualMachines(xmlToList(path + NAMETAG + id + + "']/VirtualMachines/VirtualMachine/@Name", xmlDocument)); + repo.setRepoVirtualDisks(xmlToList(path + NAMETAG + name + + "']/VirtualDisks/Disk", xmlDocument)); + repo.setRepoISOs(xmlToList( + path + NAMETAG + name + "']/ISOs/ISO", xmlDocument)); + Map<String, String> details = xmlToMap(path + NAMETAG + name + + "']", xmlDocument); + repo.setRepoDetails(details); + repos.put(name, repo); + } + return true; + } + + /* + * add_repository, <class 'agent.api.repository.Repository'> argument: + * fs_location - default: None argument: mount_point - default: None + */ + public Boolean addRepo(String remote, String local) + throws Ovm3ResourceException { + return nullIsTrueCallWrapper("add_repository", remote, local); + } + + /** + * is the same as discoverRepoDb in principle (takes an id or mountpoint) + * get_repository_meta_data, <class 'agent.api.repository.Repository'> + * argument: repo_mount_point - default: None + */ + + /* + * mount_repository_fs, <class 'agent.api.repository.Repository'> argument: + * fs_location - default: None argument: mount_point - default: None + */ + public Boolean mountRepoFs(String remote, String local) + throws Ovm3ResourceException { + return nullIsTrueCallWrapper("mount_repository_fs", remote, local); + } + + /* + * unmount_repository_fs, <class 'agent.api.repository.Repository'> + * argument: mount_point - default: None + */ + public Boolean unmountRepoFs(String local) throws Ovm3ResourceException { + return nullIsTrueCallWrapper("unmount_repository_fs", local); + } + + /* + * create_repository, <class 'agent.api.repository.Repository'> argument: + * fs_location - default: None argument: mount_point - default: None + * argument: repo_uuid - default: None argument: repo_alias - default: None + */ + public Boolean createRepo(String remote, String local, String repoid, + String repoalias) throws Ovm3ResourceException { + return nullIsTrueCallWrapper("create_repository", remote, local, + repoid, repoalias); + } + + /* + * discover_repository_db, <class 'agent.api.repository.Repository'> + * <Discover_Repository_Db_Result> <RepositoryDbList> <Repository + * Uuid="0004fb0000030000aeaca859e4a8f8c0"> + * <Fs_location>cs-mgmt:/volumes/cs-data/primary</Fs_location> + * <Mount_point>/ + * OVS/Repositories/0004fb0000030000aeaca859e4a8f8c0</Mount_point> + * <Filesystem_type>nfs</Filesystem_type> <Version>3.0</Version> + * <Alias>MyRepo</Alias> + * <Manager_uuid>0004fb00000100000af70d20dcce7d65</Manager_uuid> + * <Status>Unmounted</Status> </Repository> <Repository> ... </Repository> + * </RepositoryDbList> </Discover_Repository_Db_Result> + */ + public Boolean discoverRepoDb() throws Ovm3ResourceException { + postDbDiscovery = callWrapper("discover_repository_db"); + Document xmlDocument = prepParse((String) postDbDiscovery); + String path = "//Discover_Repository_Db_Result/RepositoryDbList/Repository"; + repoDbList = new ArrayList<String>(); + repoDbList.addAll(xmlToList(path + "/@Uuid", xmlDocument)); + for (String id : repoDbList) { + RepoDbDetails repoDb = new RepoDbDetails(); + Map<String, String> rep = xmlToMap(path + "[@Uuid='" + id + "']", + xmlDocument); + repoDb.setRepoDbDetails(rep); + repoDb.setUuid(id); + repoDbs.put(id, repoDb); + } + return true; + } + +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c27c6943/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/RpcTypeFactory.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/RpcTypeFactory.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/RpcTypeFactory.java new file mode 100644 index 0000000..1078e6e --- /dev/null +++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/objects/RpcTypeFactory.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http:www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package com.cloud.hypervisor.ovm3.objects; + +import org.apache.ws.commons.util.NamespaceContextImpl; +import org.apache.xmlrpc.common.TypeFactoryImpl; +import org.apache.xmlrpc.common.XmlRpcController; +import org.apache.xmlrpc.common.XmlRpcStreamConfig; +import org.apache.xmlrpc.parser.NullParser; +import org.apache.xmlrpc.parser.TypeParser; +import org.apache.xmlrpc.parser.AtomicParser; +import org.apache.xmlrpc.serializer.NullSerializer; +import org.apache.xmlrpc.serializer.TypeSerializer; +import org.apache.xmlrpc.serializer.TypeSerializerImpl; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.ContentHandler; + +public class RpcTypeFactory extends TypeFactoryImpl { + + public RpcTypeFactory(XmlRpcController pController) { + super(pController); + } + + @Override + public TypeParser getParser(XmlRpcStreamConfig pConfig, + NamespaceContextImpl pContext, String pURI, String pLocalName) { + if ("".equals(pURI) && NullSerializer.NIL_TAG.equals(pLocalName)) { + return new NullParser(); + } else if ("i8".equals(pLocalName)) { + return new LongTypeParser(); + } else { + return super.getParser(pConfig, pContext, pURI, pLocalName); + } + } + + public TypeSerializer getSerializer(XmlRpcStreamConfig pConfig, + Object pObject) throws SAXException { + if (pObject instanceof Long) { + return new LongTypeSerializer(); + } else { + return super.getSerializer(pConfig, pObject); + } + } + + private class LongTypeSerializer extends TypeSerializerImpl { + /* + * Tag name of an i8 value. + */ + public static final String I8_TAG = "i8"; + /* + * Fully qualified name of an i8 value. + */ + public static final String EX_I8_TAG = "i8"; + @Override + public void write(ContentHandler pHandler, Object pObject) + throws SAXException { + write(pHandler, I8_TAG, EX_I8_TAG, pObject.toString()); + } + } + + private class LongTypeParser extends AtomicParser { + protected void setResult(String pResult) throws SAXException { + try { + super.setResult(Long.valueOf(pResult.trim())); + } catch (NumberFormatException e) { + throw new SAXParseException("Failed to parse long value: " + + pResult, getDocumentLocator()); + } + } + } +}
