mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	add clouddev
This commit is contained in:
		
							parent
							
								
									3938c24b45
								
							
						
					
					
						commit
						5f6387e113
					
				| @ -27,6 +27,7 @@ | |||||||
|     <import file="${base.dir}/build/build-marvin.xml" optional="true"/> |     <import file="${base.dir}/build/build-marvin.xml" optional="true"/> | ||||||
|     <import file="${base.dir}/build/package.xml" optional="true"/> |     <import file="${base.dir}/build/package.xml" optional="true"/> | ||||||
|     <import file="${base.dir}/build/developer.xml" optional="true"/> |     <import file="${base.dir}/build/developer.xml" optional="true"/> | ||||||
|  |     <import file="${base.dir}/build/build-clouddev.xml" optional="true"/> | ||||||
|     <import file="${base.dir}/build/build-usage.xml" optional="false"/> |     <import file="${base.dir}/build/build-usage.xml" optional="false"/> | ||||||
|     <import file="${base.dir}/build/build-aws-api.xml" optional="false"/> |     <import file="${base.dir}/build/build-aws-api.xml" optional="false"/> | ||||||
| </project> | </project> | ||||||
|  | |||||||
							
								
								
									
										93
									
								
								build/build-clouddev.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								build/build-clouddev.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!-- | ||||||
|  |   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. | ||||||
|  | --> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <project name="CloudDev Targets" basedir="."> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   <condition property="port" value="${rport}" else="2222"> | ||||||
|  |       <isset property="rport"/> | ||||||
|  |   </condition> | ||||||
|  | 
 | ||||||
|  |   <condition property="host" value="${rhost}" else="localhost"> | ||||||
|  |       <isset property="rhost"/> | ||||||
|  |   </condition> | ||||||
|  | 
 | ||||||
|  |   <target name="deploydbIfSet" if="deploydb.is.set"> | ||||||
|  |     <echo message="ant deploydb"/> | ||||||
|  |     <sshexec host="${host}" port="${port}" username="root" password="password" command="echo $CATALINA_HOME; export CATALINA_HOME=/opt/apache-tomcat-6.0.32;killall java;cd /opt/incubator-cloudstack;ant deploycddb"/> | ||||||
|  |   </target> | ||||||
|  | 
 | ||||||
|  |   <target name="rdeploydb"> | ||||||
|  |     <echo message="ant rdeploydb"/> | ||||||
|  |     <sshexec host="${host}" port="${port}" username="root" password="password" command="echo $CATALINA_HOME; export CATALINA_HOME=/opt/apache-tomcat-6.0.32;killall java;cd /opt/incubator-cloudstack;ant deploycddb"/> | ||||||
|  |   </target> | ||||||
|  | 
 | ||||||
|  |   <target name="deploycddb" description="deploy specific db configuration for clouddev" depends="deploydb"> | ||||||
|  |     <exec dir="${db.scripts.dir}" executable="bash"> | ||||||
|  |       <arg value="deploy-db-clouddev.sh" /> | ||||||
|  |     </exec> | ||||||
|  |   </target> | ||||||
|  | 
 | ||||||
|  |   <target name="rdebug-suspend" > | ||||||
|  |     <echo message="ant debug-suspend"/> | ||||||
|  |     <sshexec host="${host}" port="${port}" username="root" password="password" command="killall java;sleep 1;echo $CATALINA_HOME; export CATALINA_HOME=/opt/apache-tomcat-6.0.32;cd /opt/incubator-cloudstack;ant deploy-server;ant debug-suspend"/> | ||||||
|  |   </target> | ||||||
|  |    | ||||||
|  |   <target name="rdebug"> | ||||||
|  |     <echo message="ant debug"/> | ||||||
|  |     <sshexec host="${host}" port="${port}" username="root" password="password" command="killall java;sleep 1;echo $CATALINA_HOME; export CATALINA_HOME=/opt/apache-tomcat-6.0.32;cd /opt/incubator-cloudstack;ant deploy-server; ant debug"/> | ||||||
|  |   </target> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   <target name="rdeploy" description="deploy to remote"> | ||||||
|  |     <condition property="zip.uptodate"> | ||||||
|  |       <available file="${deploy.work.dir}/client.zip" type="file"/> | ||||||
|  |     </condition> | ||||||
|  |      | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <echo message="copying build folder to remote"/> | ||||||
|  |     <scp trust="yes" port="${port}" todir="root:password@${host}:/opt/incubator-cloudstack/build">    | ||||||
|  |       <fileset dir="build"> | ||||||
|  |       </fileset> | ||||||
|  |     </scp> | ||||||
|  | 
 | ||||||
|  |     <echo message="copying deps folder to remote"/> | ||||||
|  |     <scp trust="yes" port="${port}" todir="root:password@${host}:/opt/incubator-cloudstack/deps">    | ||||||
|  |       <fileset dir="deps"> | ||||||
|  |       </fileset> | ||||||
|  |     </scp> | ||||||
|  | 
 | ||||||
|  |     <echo message="copying target folder to remote"/> | ||||||
|  |     <scp trust="yes" port="${port}" todir="root:password@${host}:/opt/incubator-cloudstack/target">    | ||||||
|  |       <fileset dir="target"> | ||||||
|  |       </fileset> | ||||||
|  |     </scp> | ||||||
|  | 
 | ||||||
|  |     <echo message="copying dist folder to remote"/> | ||||||
|  |     <scp trust="yes" port="${port}" todir="root:password@${host}:/opt/incubator-cloudstack/dist">    | ||||||
|  |       <fileset dir="dist"> | ||||||
|  |       </fileset> | ||||||
|  |     </scp> | ||||||
|  |     | ||||||
|  |     <sshexec host="${host}" port="${port}" username="root" password="password" command="echo $CATALINA_HOME; export CATALINA_HOME=/opt/apache-tomcat-6.0.32;cd /opt/incubator-cloudstack;ant deploy-server"/> | ||||||
|  | 
 | ||||||
|  |   </target> | ||||||
|  |    | ||||||
|  | </project> | ||||||
| @ -59,6 +59,7 @@ import com.cloud.host.Status; | |||||||
| import com.cloud.hypervisor.Hypervisor; | import com.cloud.hypervisor.Hypervisor; | ||||||
| import com.cloud.hypervisor.Hypervisor.HypervisorType; | import com.cloud.hypervisor.Hypervisor.HypervisorType; | ||||||
| import com.cloud.hypervisor.xen.resource.CitrixResourceBase; | import com.cloud.hypervisor.xen.resource.CitrixResourceBase; | ||||||
|  | import com.cloud.hypervisor.xen.resource.XcpOssResource; | ||||||
| import com.cloud.hypervisor.xen.resource.XcpServerResource; | import com.cloud.hypervisor.xen.resource.XcpServerResource; | ||||||
| import com.cloud.hypervisor.xen.resource.XenServer56FP1Resource; | import com.cloud.hypervisor.xen.resource.XenServer56FP1Resource; | ||||||
| import com.cloud.hypervisor.xen.resource.XenServer56Resource; | import com.cloud.hypervisor.xen.resource.XenServer56Resource; | ||||||
| @ -253,8 +254,15 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L | |||||||
|                 String hostAddr = record.address; |                 String hostAddr = record.address; | ||||||
|                  |                  | ||||||
|                 String prodVersion = record.softwareVersion.get("product_version"); |                 String prodVersion = record.softwareVersion.get("product_version"); | ||||||
|  |                 if (prodVersion == null) { | ||||||
|  |                 	prodVersion = record.softwareVersion.get("platform_version"); | ||||||
|  |                 } | ||||||
|                 String xenVersion = record.softwareVersion.get("xen"); |                 String xenVersion = record.softwareVersion.get("xen"); | ||||||
|                 String hostOS = record.softwareVersion.get("product_brand"); |                 String hostOS = record.softwareVersion.get("product_brand"); | ||||||
|  |                 if (hostOS == null) { | ||||||
|  |                 	hostOS = record.softwareVersion.get("platform_name"); | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|                 String hostOSVer = prodVersion; |                 String hostOSVer = prodVersion; | ||||||
|                 String hostKernelVer = record.softwareVersion.get("linux"); |                 String hostKernelVer = record.softwareVersion.get("linux"); | ||||||
| 
 | 
 | ||||||
| @ -400,8 +408,18 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L | |||||||
|     } |     } | ||||||
|      |      | ||||||
|     protected CitrixResourceBase createServerResource(long dcId, Long podId, Host.Record record) { |     protected CitrixResourceBase createServerResource(long dcId, Long podId, Host.Record record) { | ||||||
|         String prodBrand = record.softwareVersion.get("product_brand").trim(); |     	String prodBrand = record.softwareVersion.get("product_brand"); | ||||||
|         String prodVersion = record.softwareVersion.get("product_version").trim(); |     	if (prodBrand == null) { | ||||||
|  |     		prodBrand = record.softwareVersion.get("platform_name").trim(); | ||||||
|  |     	} else { | ||||||
|  |     		prodBrand = prodBrand.trim(); | ||||||
|  |     	} | ||||||
|  |     	String prodVersion = record.softwareVersion.get("product_version"); | ||||||
|  |     	if (prodVersion == null) { | ||||||
|  |     		prodVersion = record.softwareVersion.get("platform_version").trim(); | ||||||
|  |     	} else { | ||||||
|  |     		prodVersion = prodVersion.trim(); | ||||||
|  |     	} | ||||||
| 
 | 
 | ||||||
|     	if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") ||  prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4") ))  |     	if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") ||  prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4") ))  | ||||||
|     		return new XcpServerResource(); |     		return new XcpServerResource(); | ||||||
| @ -424,10 +442,15 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L | |||||||
|     		} |     		} | ||||||
|     	} |     	} | ||||||
|     	 |     	 | ||||||
|  |     	if (prodBrand.equals("XCP_Kronos")) { | ||||||
|  |     		return new XcpOssResource(); | ||||||
|  |     	} | ||||||
|  |     	 | ||||||
|     	String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6,  XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2 but this one is " + prodBrand + " " + prodVersion; |     	String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6,  XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2 but this one is " + prodBrand + " " + prodVersion; | ||||||
|     			_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); |     			_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); | ||||||
|     	s_logger.debug(msg); |     	s_logger.debug(msg); | ||||||
|     	throw new RuntimeException(msg); |     	throw new RuntimeException(msg); | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     protected void serverConfig() {       |     protected void serverConfig() {       | ||||||
| @ -457,8 +480,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L | |||||||
|         Boolean.parseBoolean(value); |         Boolean.parseBoolean(value); | ||||||
| 
 | 
 | ||||||
|         value = _params.get("xen.check.hvm"); |         value = _params.get("xen.check.hvm"); | ||||||
|         _checkHvm = value == null ? true : Boolean.parseBoolean(value); |         _checkHvm = false; | ||||||
|          |  | ||||||
|         _connPool = XenServerConnectionPool.getInstance(); |         _connPool = XenServerConnectionPool.getInstance(); | ||||||
|          |          | ||||||
|         _agentMgr.registerForHostEvents(this, true, false, true); |         _agentMgr.registerForHostEvents(this, true, false, true); | ||||||
| @ -567,7 +589,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L | |||||||
|             } else if("5.6 FP1".equals(prodVersionTextShort)) { |             } else if("5.6 FP1".equals(prodVersionTextShort)) { | ||||||
|                 resource = XenServer56FP1Resource.class.getName(); |                 resource = XenServer56FP1Resource.class.getName(); | ||||||
|             } |             } | ||||||
|  |         } else if (prodBrand.equals("XCP_Kronos")) { | ||||||
|  |         	resource = XcpOssResource.class.getName(); | ||||||
|         } |         } | ||||||
|  |          | ||||||
|         if( resource == null ){ |         if( resource == null ){ | ||||||
|             String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2 but this one is " + prodBrand + " " + prodVersion; |             String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2 but this one is " + prodBrand + " " + prodVersion; | ||||||
|             s_logger.debug(msg); |             s_logger.debug(msg); | ||||||
|  | |||||||
| @ -286,7 +286,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|     protected List<VIF> _tmpDom0Vif = new ArrayList<VIF>(); |     protected List<VIF> _tmpDom0Vif = new ArrayList<VIF>(); | ||||||
| 
 | 
 | ||||||
|     public enum SRType { |     public enum SRType { | ||||||
|         NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA, EXT; |         NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA, EXT, FILE; | ||||||
| 
 | 
 | ||||||
|         String _str; |         String _str; | ||||||
| 
 | 
 | ||||||
| @ -3870,7 +3870,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|             Map<SR, SR.Record> map = SR.getAllRecords(conn); |             Map<SR, SR.Record> map = SR.getAllRecords(conn); | ||||||
|             for (Map.Entry<SR, SR.Record> entry : map.entrySet()) { |             for (Map.Entry<SR, SR.Record> entry : map.entrySet()) { | ||||||
|                 SR.Record srRec = entry.getValue(); |                 SR.Record srRec = entry.getValue(); | ||||||
|                 if (SRType.EXT.equals(srRec.type)) { |                 if (SRType.FILE.equals(srRec.type) || SRType.EXT.equals(srRec.type)) { | ||||||
|                     Set<PBD> pbds = srRec.PBDs; |                     Set<PBD> pbds = srRec.PBDs; | ||||||
|                     if (pbds == null) { |                     if (pbds == null) { | ||||||
|                         continue; |                         continue; | ||||||
| @ -3902,6 +3902,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|         SR lvmsr = getLocalLVMSR(conn); |         SR lvmsr = getLocalLVMSR(conn); | ||||||
|         if (lvmsr != null) { |         if (lvmsr != null) { | ||||||
|             try { |             try { | ||||||
|  |             	_host.localSRuuid = lvmsr.getUuid(conn); | ||||||
|  |             	 | ||||||
|                 String lvmuuid = lvmsr.getUuid(conn); |                 String lvmuuid = lvmsr.getUuid(conn); | ||||||
|                 long cap = lvmsr.getPhysicalSize(conn); |                 long cap = lvmsr.getPhysicalSize(conn); | ||||||
|                 if (cap > 0) { |                 if (cap > 0) { | ||||||
| @ -3932,6 +3934,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|         if (extsr != null) { |         if (extsr != null) { | ||||||
|             try { |             try { | ||||||
|                 String extuuid = extsr.getUuid(conn); |                 String extuuid = extsr.getUuid(conn); | ||||||
|  |                 _host.localSRuuid = extuuid; | ||||||
|                 long cap = extsr.getPhysicalSize(conn); |                 long cap = extsr.getPhysicalSize(conn); | ||||||
|                 if (cap > 0) { |                 if (cap > 0) { | ||||||
|                     long avail = cap - extsr.getPhysicalUtilisation(conn); |                     long avail = cap - extsr.getPhysicalUtilisation(conn); | ||||||
| @ -3956,6 +3959,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|                 s_logger.warn(msg); |                 s_logger.warn(msg); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |          | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -4033,7 +4037,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             Host.Record hr = myself.getRecord(conn); |             Host.Record hr = myself.getRecord(conn); | ||||||
|             _host.product_version = hr.softwareVersion.get("product_version").trim(); |              | ||||||
|  |             _host.product_version = hr.softwareVersion.get("product_version"); | ||||||
|  |             if (_host.product_version == null) { | ||||||
|  |             	_host.product_version = hr.softwareVersion.get("platform_version"); | ||||||
|  |             } else { | ||||||
|  |             	_host.product_version = _host.product_version.trim(); | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             XsLocalNetwork privateNic = getManagementNetwork(conn); |             XsLocalNetwork privateNic = getManagementNetwork(conn); | ||||||
|             _privateNetworkName = privateNic.getNetworkRecord(conn).nameLabel; |             _privateNetworkName = privateNic.getNetworkRecord(conn).nameLabel; | ||||||
| @ -4493,8 +4503,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|             } finally { |             } finally { | ||||||
|                 sshConnection.close(); |                 sshConnection.close(); | ||||||
|             } |             } | ||||||
|  |              | ||||||
|             hr.tags.add("vmops-version-" + version); |             hr.tags.add("vmops-version-" + version); | ||||||
|             host.setTags(conn, hr.tags); |             host.setTags(conn, hr.tags); | ||||||
|  |              | ||||||
|             return true; |             return true; | ||||||
|         } catch (XenAPIException e) { |         } catch (XenAPIException e) { | ||||||
|             String msg = "Xen setup failed due to " + e.toString(); |             String msg = "Xen setup failed due to " + e.toString(); | ||||||
| @ -5106,13 +5118,19 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|             if (details == null) { |             if (details == null) { | ||||||
|                 details = new HashMap<String, String>(); |                 details = new HashMap<String, String>(); | ||||||
|             } |             } | ||||||
|             details.put("product_brand", hr.softwareVersion.get("product_brand")); | 
 | ||||||
|             details.put("product_version", hr.softwareVersion.get("product_version")); |             String productBrand = hr.softwareVersion.get("product_brand"); | ||||||
|  |             if (productBrand == null) { | ||||||
|  |             	productBrand = hr.softwareVersion.get("platform_name"); | ||||||
|  |             } | ||||||
|  |             details.put("product_brand", productBrand); | ||||||
|  |             details.put("product_version", _host.product_version); | ||||||
|  | 
 | ||||||
|             if( hr.softwareVersion.get("product_version_text_short") != null ) { |             if( hr.softwareVersion.get("product_version_text_short") != null ) { | ||||||
|                 details.put("product_version_text_short", hr.softwareVersion.get("product_version_text_short")); |                 details.put("product_version_text_short", hr.softwareVersion.get("product_version_text_short")); | ||||||
|                 cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short"));                 |                 cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short"));                 | ||||||
|             }else{ |             }else{ | ||||||
|                 cmd.setHypervisorVersion(hr.softwareVersion.get("product_version")); |             	cmd.setHypervisorVersion(_host.product_version); | ||||||
|             } |             } | ||||||
|             if (_privateNetworkName != null) { |             if (_privateNetworkName != null) { | ||||||
|                 details.put("private.network.device", _privateNetworkName); |                 details.put("private.network.device", _privateNetworkName); | ||||||
| @ -5165,9 +5183,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|                 cmd.setPrivateMacAddress(pifr.MAC); |                 cmd.setPrivateMacAddress(pifr.MAC); | ||||||
|                 cmd.setPrivateNetmask(pifr.netmask); |                 cmd.setPrivateNetmask(pifr.netmask); | ||||||
|             } else { |             } else { | ||||||
|                 String msg = "Private network " + _privateNetworkName + " doesn't have IP address, please check the host network configuration"; |             	 cmd.setPrivateIpAddress(_host.ip); | ||||||
|                 s_logger.error(msg); |                  cmd.setPrivateMacAddress(pifr.MAC); | ||||||
|                 throw new CloudRuntimeException(msg); |                  cmd.setPrivateNetmask("255.255.255.0"); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             pif = PIF.getByUuid(conn, _host.storagePif1); |             pif = PIF.getByUuid(conn, _host.storagePif1); | ||||||
| @ -5330,7 +5348,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|                 vdir.virtualSize = dskch.getSize(); |                 vdir.virtualSize = dskch.getSize(); | ||||||
|                 vdi = VDI.create(conn, vdir); |                 vdi = VDI.create(conn, vdir); | ||||||
|             } |             } | ||||||
| 
 |  | ||||||
|             VDI.Record vdir; |             VDI.Record vdir; | ||||||
|             vdir = vdi.getRecord(conn); |             vdir = vdi.getRecord(conn); | ||||||
|             s_logger.debug("Succesfully created VDI for " + cmd + ".  Uuid = " + vdir.uuid); |             s_logger.debug("Succesfully created VDI for " + cmd + ".  Uuid = " + vdir.uuid); | ||||||
| @ -6764,6 +6781,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe | |||||||
|         public int speed; |         public int speed; | ||||||
|         public int cpus; |         public int cpus; | ||||||
|         public String product_version; |         public String product_version; | ||||||
|  |         public String localSRuuid; | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public String toString() { |         public String toString() { | ||||||
|  | |||||||
| @ -0,0 +1,127 @@ | |||||||
|  | // 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 | ||||||
|  | // 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.xen.resource; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Set; | ||||||
|  | 
 | ||||||
|  | import javax.ejb.Local; | ||||||
|  | 
 | ||||||
|  | import org.apache.log4j.Logger; | ||||||
|  | import org.apache.xmlrpc.XmlRpcException; | ||||||
|  | 
 | ||||||
|  | import com.cloud.agent.api.Answer; | ||||||
|  | import com.cloud.agent.api.Command; | ||||||
|  | import com.cloud.agent.api.NetworkUsageAnswer; | ||||||
|  | import com.cloud.agent.api.NetworkUsageCommand; | ||||||
|  | import com.cloud.agent.api.StartupRoutingCommand; | ||||||
|  | import com.cloud.resource.ServerResource; | ||||||
|  | import com.cloud.utils.exception.CloudRuntimeException; | ||||||
|  | import com.cloud.utils.script.Script; | ||||||
|  | import com.xensource.xenapi.Connection; | ||||||
|  | import com.xensource.xenapi.Types; | ||||||
|  | import com.xensource.xenapi.VBD; | ||||||
|  | import com.xensource.xenapi.VDI; | ||||||
|  | import com.xensource.xenapi.VM; | ||||||
|  | import com.xensource.xenapi.Types.XenAPIException; | ||||||
|  | 
 | ||||||
|  | @Local(value=ServerResource.class) | ||||||
|  | public class XcpOssResource extends CitrixResourceBase { | ||||||
|  | 	 private final static Logger s_logger = Logger.getLogger(XcpServerResource.class); | ||||||
|  |     @Override | ||||||
|  |     protected List<File> getPatchFiles() { | ||||||
|  |         List<File> files = new ArrayList<File>(); | ||||||
|  |         String patch = "scripts/vm/hypervisor/xenserver/xcposs/patch"; | ||||||
|  |         String patchfilePath = Script.findScript("", patch); | ||||||
|  |         if (patchfilePath == null) { | ||||||
|  |             throw new CloudRuntimeException("Unable to find patch file " + patch); | ||||||
|  |         } | ||||||
|  |         File file = new File(patchfilePath); | ||||||
|  |         files.add(file); | ||||||
|  |         return files; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     @Override | ||||||
|  | 	protected void fillHostInfo(Connection conn, StartupRoutingCommand cmd) { | ||||||
|  |     	super.fillHostInfo(conn, cmd); | ||||||
|  |     	cmd.setCaps(cmd.getCapabilities() + " , hvm"); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     @Override | ||||||
|  |     protected String getGuestOsType(String stdType, boolean bootFromCD) { | ||||||
|  |         return CitrixHelper.getXcpGuestOsType(stdType); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     protected VBD createPatchVbd(Connection conn, String vmName, VM vm) throws XmlRpcException, XenAPIException { | ||||||
|  |     	if (_host.localSRuuid != null) { | ||||||
|  |     		//create an iso vdi on it | ||||||
|  |     		String result = callHostPlugin(conn, "vmops", "createISOVHD", "uuid", _host.localSRuuid); | ||||||
|  |     		if (result == null || result.equalsIgnoreCase("Failed")) { | ||||||
|  |     			 throw new CloudRuntimeException("can not create systemvm vdi"); | ||||||
|  |     		} | ||||||
|  |     		 | ||||||
|  |     		Set<VDI> vdis = VDI.getByNameLabel(conn, "systemvm-vdi"); | ||||||
|  |     		if (vdis.size() != 1) { | ||||||
|  |     			throw new CloudRuntimeException("can not find systemvmiso"); | ||||||
|  |     		} | ||||||
|  |     		VDI systemvmVDI = vdis.iterator().next(); | ||||||
|  |     		 | ||||||
|  |     		VBD.Record cdromVBDR = new VBD.Record(); | ||||||
|  |             cdromVBDR.VM = vm; | ||||||
|  |             cdromVBDR.empty = false; | ||||||
|  |             cdromVBDR.bootable = false; | ||||||
|  |             cdromVBDR.userdevice = "3"; | ||||||
|  |             cdromVBDR.mode = Types.VbdMode.RO; | ||||||
|  |             cdromVBDR.type = Types.VbdType.DISK; | ||||||
|  |             cdromVBDR.VDI = systemvmVDI; | ||||||
|  |             VBD cdromVBD = VBD.create(conn, cdromVBDR); | ||||||
|  |             return cdromVBD; | ||||||
|  |     	} else { | ||||||
|  |     		 throw new CloudRuntimeException("can not find local sr"); | ||||||
|  |     	} | ||||||
|  |     } | ||||||
|  |      | ||||||
|  | 
 | ||||||
|  |     protected NetworkUsageAnswer execute(NetworkUsageCommand cmd) { | ||||||
|  |         try { | ||||||
|  |             Connection conn = getConnection(); | ||||||
|  |             if(cmd.getOption()!=null && cmd.getOption().equals("create") ){ | ||||||
|  |                 String result = networkUsage(conn, cmd.getPrivateIP(), "create", null); | ||||||
|  |                 NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L); | ||||||
|  |                 return answer; | ||||||
|  |             } | ||||||
|  |             long[] stats = getNetworkStats(conn, cmd.getPrivateIP()); | ||||||
|  |             NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]); | ||||||
|  |             return answer; | ||||||
|  |         } catch (Exception ex) { | ||||||
|  |             s_logger.warn("Failed to get network usage stats due to ", ex); | ||||||
|  |             return new NetworkUsageAnswer(cmd, ex);  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     @Override | ||||||
|  |     public Answer executeRequest(Command cmd) { | ||||||
|  |         if (cmd instanceof NetworkUsageCommand) { | ||||||
|  |             return execute((NetworkUsageCommand) cmd); | ||||||
|  |         } else { | ||||||
|  |             return super.executeRequest(cmd); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										258
									
								
								scripts/vm/hypervisor/xenserver/xcposs/NFSSR.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								scripts/vm/hypervisor/xenserver/xcposs/NFSSR.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,258 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | # Copyright 2012 Citrix Systems, Inc. Licensed under the | ||||||
|  | # Apache License, Version 2.0 (the "License"); you may not use this | ||||||
|  | # file except in compliance with the License.  Citrix Systems, Inc. | ||||||
|  | # reserves all rights not expressly granted by 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. | ||||||
|  | #  | ||||||
|  | # Automatically generated by addcopyright.py at 04/03/2012 | ||||||
|  | # FileSR: local-file storage repository | ||||||
|  | 
 | ||||||
|  | import SR, VDI, SRCommand, FileSR, util | ||||||
|  | import errno | ||||||
|  | import os, re, sys, stat | ||||||
|  | import time | ||||||
|  | import xml.dom.minidom | ||||||
|  | import xs_errors | ||||||
|  | import nfs | ||||||
|  | import vhdutil | ||||||
|  | from lock import Lock | ||||||
|  | import cleanup | ||||||
|  | 
 | ||||||
|  | CAPABILITIES = ["SR_PROBE","SR_UPDATE", "SR_CACHING", \ | ||||||
|  |                 "VDI_CREATE","VDI_DELETE","VDI_ATTACH","VDI_DETACH", \ | ||||||
|  |                 "VDI_UPDATE", "VDI_CLONE","VDI_SNAPSHOT","VDI_RESIZE", \ | ||||||
|  |                 "VDI_RESIZE_ONLINE", "VDI_RESET_ON_BOOT", "ATOMIC_PAUSE"] | ||||||
|  | 
 | ||||||
|  | CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ | ||||||
|  |                   [ 'serverpath', 'path on remote server (required)' ] ] | ||||||
|  | 
 | ||||||
|  |                    | ||||||
|  | DRIVER_INFO = { | ||||||
|  |     'name': 'NFS VHD', | ||||||
|  |     'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', | ||||||
|  |     'vendor': 'Citrix Systems Inc', | ||||||
|  |     'copyright': '(C) 2008 Citrix Systems Inc', | ||||||
|  |     'driver_version': '1.0', | ||||||
|  |     'required_api_version': '1.0', | ||||||
|  |     'capabilities': CAPABILITIES, | ||||||
|  |     'configuration': CONFIGURATION | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # The mountpoint for the directory when performing an sr_probe.  All probes | ||||||
|  | PROBE_MOUNTPOINT = "probe" | ||||||
|  | NFSPORT = 2049 | ||||||
|  | DEFAULT_TRANSPORT = "tcp" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class NFSSR(FileSR.FileSR): | ||||||
|  |     """NFS file-based storage repository""" | ||||||
|  |     def handles(type): | ||||||
|  |         return type == 'nfs' | ||||||
|  |     handles = staticmethod(handles) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def load(self, sr_uuid): | ||||||
|  |         self.ops_exclusive = FileSR.OPS_EXCLUSIVE | ||||||
|  |         self.lock = Lock(vhdutil.LOCK_TYPE_SR, self.uuid) | ||||||
|  |         self.sr_vditype = SR.DEFAULT_TAP | ||||||
|  |         if not self.dconf.has_key('server'): | ||||||
|  |             raise xs_errors.XenError('ConfigServerMissing') | ||||||
|  |         self.remoteserver = self.dconf['server'] | ||||||
|  |         self.path = os.path.join(SR.MOUNT_BASE, sr_uuid) | ||||||
|  | 
 | ||||||
|  |         # Test for the optional 'nfsoptions' dconf attribute | ||||||
|  |         self.transport = DEFAULT_TRANSPORT | ||||||
|  |         if self.dconf.has_key('useUDP') and self.dconf['useUDP'] == 'true': | ||||||
|  |             self.transport = "udp" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def validate_remotepath(self, scan): | ||||||
|  |         if not self.dconf.has_key('serverpath'): | ||||||
|  |             if scan: | ||||||
|  |                 try: | ||||||
|  |                     self.scan_exports(self.dconf['server']) | ||||||
|  |                 except: | ||||||
|  |                     pass | ||||||
|  |             raise xs_errors.XenError('ConfigServerPathMissing') | ||||||
|  |         if not self._isvalidpathstring(self.dconf['serverpath']): | ||||||
|  |             raise xs_errors.XenError('ConfigServerPathBad', \ | ||||||
|  |                   opterr='serverpath is %s' % self.dconf['serverpath']) | ||||||
|  | 
 | ||||||
|  |     def check_server(self): | ||||||
|  |         try: | ||||||
|  |             nfs.check_server_tcp(self.remoteserver) | ||||||
|  |         except nfs.NfsException, exc: | ||||||
|  |             raise xs_errors.XenError('NFSVersion', | ||||||
|  |                                      opterr=exc.errstr) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def mount(self, mountpoint, remotepath): | ||||||
|  |         try: | ||||||
|  |             nfs.soft_mount(mountpoint, self.remoteserver, remotepath, self.transport) | ||||||
|  |         except nfs.NfsException, exc: | ||||||
|  |             raise xs_errors.XenError('NFSMount', opterr=exc.errstr) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def attach(self, sr_uuid): | ||||||
|  |         self.validate_remotepath(False) | ||||||
|  |         #self.remotepath = os.path.join(self.dconf['serverpath'], sr_uuid) | ||||||
|  |         self.remotepath = self.dconf['serverpath'] | ||||||
|  |         util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') | ||||||
|  |         self.mount_remotepath(sr_uuid) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def mount_remotepath(self, sr_uuid): | ||||||
|  |         if not self._checkmount(): | ||||||
|  |             self.check_server() | ||||||
|  |             self.mount(self.path, self.remotepath) | ||||||
|  | 
 | ||||||
|  |         return super(NFSSR, self).attach(sr_uuid) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def probe(self): | ||||||
|  |         # Verify NFS target and port | ||||||
|  |         util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') | ||||||
|  |          | ||||||
|  |         self.validate_remotepath(True) | ||||||
|  |         self.check_server() | ||||||
|  | 
 | ||||||
|  |         temppath = os.path.join(SR.MOUNT_BASE, PROBE_MOUNTPOINT) | ||||||
|  | 
 | ||||||
|  |         self.mount(temppath, self.dconf['serverpath']) | ||||||
|  |         try: | ||||||
|  |             return nfs.scan_srlist(temppath) | ||||||
|  |         finally: | ||||||
|  |             try: | ||||||
|  |                 nfs.unmount(temppath, True) | ||||||
|  |             except: | ||||||
|  |                 pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def detach(self, sr_uuid): | ||||||
|  |         """Detach the SR: Unmounts and removes the mountpoint""" | ||||||
|  |         if not self._checkmount(): | ||||||
|  |             return | ||||||
|  |         util.SMlog("Aborting GC/coalesce") | ||||||
|  |         cleanup.abort(self.uuid) | ||||||
|  | 
 | ||||||
|  |         # Change directory to avoid unmount conflicts | ||||||
|  |         os.chdir(SR.MOUNT_BASE) | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             nfs.unmount(self.path, True) | ||||||
|  |         except nfs.NfsException, exc: | ||||||
|  |             raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) | ||||||
|  | 
 | ||||||
|  |         return super(NFSSR, self).detach(sr_uuid) | ||||||
|  |          | ||||||
|  | 
 | ||||||
|  |     def create(self, sr_uuid, size): | ||||||
|  |         util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') | ||||||
|  |         self.validate_remotepath(True) | ||||||
|  |         if self._checkmount(): | ||||||
|  |             raise xs_errors.XenError('NFSAttached') | ||||||
|  | 
 | ||||||
|  |         # Set the target path temporarily to the base dir | ||||||
|  |         # so that we can create the target SR directory | ||||||
|  |         self.remotepath = self.dconf['serverpath'] | ||||||
|  |         try: | ||||||
|  |             self.mount_remotepath(sr_uuid) | ||||||
|  |         except Exception, exn: | ||||||
|  |             try: | ||||||
|  |                 os.rmdir(self.path) | ||||||
|  |             except: | ||||||
|  |                 pass | ||||||
|  |             raise exn | ||||||
|  | 
 | ||||||
|  |         #newpath = os.path.join(self.path, sr_uuid) | ||||||
|  |         #if util.ioretry(lambda: util.pathexists(newpath)): | ||||||
|  |         #    if len(util.ioretry(lambda: util.listdir(newpath))) != 0: | ||||||
|  |         #        self.detach(sr_uuid) | ||||||
|  |         #        raise xs_errors.XenError('SRExists') | ||||||
|  |         #else: | ||||||
|  |         #    try: | ||||||
|  |         #        util.ioretry(lambda: util.makedirs(newpath)) | ||||||
|  |         #    except util.CommandException, inst: | ||||||
|  |         #        if inst.code != errno.EEXIST: | ||||||
|  |         #            self.detach(sr_uuid) | ||||||
|  |         #            raise xs_errors.XenError('NFSCreate',  | ||||||
|  |         #                opterr='remote directory creation error is %d'  | ||||||
|  |         #                % inst.code) | ||||||
|  |         self.detach(sr_uuid) | ||||||
|  | 
 | ||||||
|  |     def delete(self, sr_uuid): | ||||||
|  |         # try to remove/delete non VDI contents first | ||||||
|  |         super(NFSSR, self).delete(sr_uuid) | ||||||
|  |         try: | ||||||
|  |             if self._checkmount(): | ||||||
|  |                 self.detach(sr_uuid) | ||||||
|  | 
 | ||||||
|  |             # Set the target path temporarily to the base dir | ||||||
|  |             # so that we can remove the target SR directory | ||||||
|  |             self.remotepath = self.dconf['serverpath'] | ||||||
|  |             self.mount_remotepath(sr_uuid) | ||||||
|  |             newpath = os.path.join(self.path, sr_uuid) | ||||||
|  | 
 | ||||||
|  |             if util.ioretry(lambda: util.pathexists(newpath)): | ||||||
|  |                 util.ioretry(lambda: os.rmdir(newpath)) | ||||||
|  |             self.detach(sr_uuid) | ||||||
|  |         except util.CommandException, inst: | ||||||
|  |             self.detach(sr_uuid) | ||||||
|  |             if inst.code != errno.ENOENT: | ||||||
|  |                 raise xs_errors.XenError('NFSDelete') | ||||||
|  | 
 | ||||||
|  |     def vdi(self, uuid, loadLocked = False): | ||||||
|  |         if not loadLocked: | ||||||
|  |             return NFSFileVDI(self, uuid) | ||||||
|  |         return NFSFileVDI(self, uuid) | ||||||
|  |      | ||||||
|  |     def _checkmount(self): | ||||||
|  |         return util.ioretry(lambda: util.pathexists(self.path)) \ | ||||||
|  |                and util.ioretry(lambda: util.ismount(self.path)) | ||||||
|  | 
 | ||||||
|  |     def scan_exports(self, target): | ||||||
|  |         util.SMlog("scanning2 (target=%s)" % target) | ||||||
|  |         dom = nfs.scan_exports(target) | ||||||
|  |         print >>sys.stderr,dom.toprettyxml() | ||||||
|  | 
 | ||||||
|  | class NFSFileVDI(FileSR.FileVDI): | ||||||
|  |     def attach(self, sr_uuid, vdi_uuid): | ||||||
|  |         try: | ||||||
|  |             vdi_ref = self.sr.srcmd.params['vdi_ref'] | ||||||
|  |             self.session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, \ | ||||||
|  |                     "vdi-type") | ||||||
|  |             self.session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, \ | ||||||
|  |                     "storage-type") | ||||||
|  |             self.session.xenapi.VDI.add_to_xenstore_data(vdi_ref, \ | ||||||
|  |                     "storage-type", "nfs") | ||||||
|  |         except: | ||||||
|  |             util.logException("NFSSR:attach") | ||||||
|  |             pass | ||||||
|  |         return super(NFSFileVDI, self).attach(sr_uuid, vdi_uuid) | ||||||
|  | 
 | ||||||
|  |     def get_mtime(self, path): | ||||||
|  |         st = util.ioretry_stat(lambda: os.stat(path)) | ||||||
|  |         return st[stat.ST_MTIME] | ||||||
|  | 
 | ||||||
|  |     def clone(self, sr_uuid, vdi_uuid): | ||||||
|  |         timestamp_before = int(self.get_mtime(self.sr.path)) | ||||||
|  |         ret = super(NFSFileVDI, self).clone(sr_uuid, vdi_uuid) | ||||||
|  |         timestamp_after = int(self.get_mtime(self.sr.path)) | ||||||
|  |         if timestamp_after == timestamp_before: | ||||||
|  |             util.SMlog("SR dir timestamp didn't change, updating") | ||||||
|  |             timestamp_after += 1 | ||||||
|  |             os.utime(self.sr.path, (timestamp_after, timestamp_after)) | ||||||
|  |         return ret | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     SRCommand.run(NFSSR, DRIVER_INFO) | ||||||
|  | else: | ||||||
|  |     SR.registerSR(NFSSR) | ||||||
| @ -0,0 +1,184 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Copyright 2012 Citrix Systems, Inc. Licensed under the | ||||||
|  | # Apache License, Version 2.0 (the "License"); you may not use this | ||||||
|  | # file except in compliance with the License.  Citrix Systems, Inc. | ||||||
|  | # reserves all rights not expressly granted by 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. | ||||||
|  | #  | ||||||
|  | # Automatically generated by addcopyright.py at 04/03/2012 | ||||||
|  | 
 | ||||||
|  | #set -x | ||||||
|  |   | ||||||
|  | usage() { | ||||||
|  |   printf "Usage: %s [vhd file in secondary storage] [uuid of the source sr] [name label]  \n" $(basename $0)  | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | cleanup() | ||||||
|  | { | ||||||
|  |   if [ ! -z $localmp ]; then  | ||||||
|  |     umount -fl $localmp | ||||||
|  |     if [ $? -eq 0 ];  then | ||||||
|  |       rmdir $localmp | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if [ -z $1 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "2#no mountpoint" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   mountpoint=${1%/*} | ||||||
|  |   vhdfilename=${1##*/} | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z $2 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "3#no uuid of the source sr" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   sruuid=$2 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | type=$(xe sr-param-get uuid=$sruuid param-name=type) | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "4#sr $sruuid doesn't exist" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z $3 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "3#no namelabel" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   namelabel=$3 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | localmp=/var/run/cloud_mount/$(uuidgen -r) | ||||||
|  | 
 | ||||||
|  | mkdir -p $localmp | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "5#can't make dir $localmp" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | mount -o tcp,soft,ro,timeo=133,retrans=1 $mountpoint $localmp | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "6#can't mount $mountpoint to $localmp" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | vhdfile=$localmp/$vhdfilename | ||||||
|  | if [ ${vhdfile%.vhd} == ${vhdfile} ] ; then | ||||||
|  |   vhdfile=$(ls $vhdfile/*.vhd) | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "7#There is no vhd file under $mountpoint" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | VHDUTIL="/usr/bin/vhd-util" | ||||||
|  | 
 | ||||||
|  | copyvhd() | ||||||
|  | { | ||||||
|  |   local desvhd=$1 | ||||||
|  |   local srcvhd=$2 | ||||||
|  |   local vsize=$3 | ||||||
|  |   local type=$4 | ||||||
|  |   local parent=`$VHDUTIL query -p -n $srcvhd` | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "30#failed to query $srcvhd" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  |   if [ "${parent##*vhd has}" = " no parent" ]; then | ||||||
|  |     dd if=$srcvhd of=$desvhd bs=2M      | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |       echo "31#failed to dd $srcvhd to $desvhd" | ||||||
|  |       cleanup | ||||||
|  |      exit 0 | ||||||
|  |     fi | ||||||
|  |     if [ $type != "nfs" -a $type != "ext" -a $type != "file" ]; then | ||||||
|  |       dd if=$srcvhd of=$desvhd bs=512 seek=$(($(($vsize/512))-1)) count=1 | ||||||
|  |       $VHDUTIL modify -s $vsize -n $desvhd | ||||||
|  |       if [ $? -ne 0 ]; then | ||||||
|  |         echo "32#failed to set new vhd physical size for vdi vdi $uuid" | ||||||
|  |         cleanup | ||||||
|  |         exit 0 | ||||||
|  |       fi | ||||||
|  |     fi | ||||||
|  |   else | ||||||
|  |     copyvhd $desvhd $parent $vsize $type | ||||||
|  |     $VHDUTIL coalesce -p $desvhd -n $srcvhd | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |       echo "32#failed to coalesce  $desvhd to $srcvhd" | ||||||
|  |       cleanup | ||||||
|  |      exit 0 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | size=$($VHDUTIL query -v -n $vhdfile) | ||||||
|  | uuid=$(xe vdi-create sr-uuid=$sruuid virtual-size=${size}MiB type=user name-label=$namelabel) | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "9#can not create vdi in sr $sruuid" | ||||||
|  |   cleanup | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if [ $type == "nfs" -o $type == "ext" ]; then | ||||||
|  |   desvhd=/run/sr-mount/$sruuid/$uuid.vhd | ||||||
|  |   copyvhd $desvhd $vhdfile 0 $type | ||||||
|  | 
 | ||||||
|  | elif [ $type == "lvmoiscsi" -o $type == "lvm" -o $type == "lvmohba" ]; then | ||||||
|  |   lvsize=$(xe vdi-param-get uuid=$uuid param-name=physical-utilisation) | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "12#failed to get physical size of vdi $uuid" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  |   desvhd=/dev/VG_XenStorage-$sruuid/VHD-$uuid | ||||||
|  |   lvchange -ay $desvhd | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "10#lvm can not make VDI $uuid  visible" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  |   copyvhd $desvhd $vhdfile $lvsize $type | ||||||
|  | elif [ $type == "file" ]; then | ||||||
|  |   pbd=`xe sr-param-list uuid=$sruuid |grep PBDs | awk '{print $3}'` | ||||||
|  |   path=`xe pbd-param-list uuid=$pbd |grep device-config |awk '{print $4}'` | ||||||
|  |   desvhd=$path/$uuid.vhd | ||||||
|  |   copyvhd $desvhd $vhdfile 0 $type | ||||||
|  | 
 | ||||||
|  | else  | ||||||
|  |   echo "15#doesn't support sr type $type" | ||||||
|  |   cleanup | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | $VHDUTIL set -n $desvhd -f "hidden" -v "0" > /dev/null | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "21#failed to set hidden to 0  $desvhd" | ||||||
|  |   cleanup | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | xe sr-scan uuid=$sruuid | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "14#failed to scan sr $sruuid" | ||||||
|  |   cleanup | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | echo "0#$uuid" | ||||||
|  | cleanup | ||||||
|  | exit 0 | ||||||
| @ -0,0 +1,126 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Copyright 2012 Citrix Systems, Inc. Licensed under the | ||||||
|  | # Apache License, Version 2.0 (the "License"); you may not use this | ||||||
|  | # file except in compliance with the License.  Citrix Systems, Inc. | ||||||
|  | # reserves all rights not expressly granted by 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. | ||||||
|  | #  | ||||||
|  | # Automatically generated by addcopyright.py at 04/03/2012 | ||||||
|  | 
 | ||||||
|  | #set -x | ||||||
|  |   | ||||||
|  | usage() { | ||||||
|  |   printf "Usage: %s [mountpoint in secondary storage] [uuid of the source vdi] [uuid of the source sr]\n" $(basename $0)  | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | cleanup() | ||||||
|  | { | ||||||
|  |   if [ ! -z $localmp ]; then  | ||||||
|  |     umount $localmp | ||||||
|  |     if [ $? -eq 0 ];  then | ||||||
|  |       rmdir $localmp | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if [ -z $1 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "1#no mountpoint" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   mountpoint=$1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z $2 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "2#no uuid of the source sr" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   vdiuuid=$2 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if [ -z $3 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "3#no uuid of the source sr" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   sruuid=$3 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | type=$(xe sr-param-get uuid=$sruuid param-name=type) | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "4#sr $sruuid doesn't exist" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | localmp=/var/run/cloud_mount/$(uuidgen -r) | ||||||
|  | 
 | ||||||
|  | mkdir -p $localmp | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "5#can't make dir $localmp" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | mount -o tcp,soft,timeo=133,retrans=1 $mountpoint $localmp | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "6#can't mount $mountpoint to $localmp" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | vhdfile=$localmp/${vdiuuid}.vhd | ||||||
|  | 
 | ||||||
|  | if [ $type == "nfs" -o $type == "ext" ]; then | ||||||
|  |   dd if=/var/run/sr-mount/$sruuid/${vdiuuid}.vhd of=$vhdfile bs=2M | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     rm -f $vhdfile | ||||||
|  |     echo "8#failed to copy /var/run/sr-mount/$sruuid/${vdiuuid}.vhd to secondarystorage" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  | elif [ $type == "lvmoiscsi" -o $type == "lvm" -o $type == "lvmohba" ]; then | ||||||
|  |   lvchange -ay /dev/VG_XenStorage-$sruuid/VHD-$vdiuuid | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "9#lvm can not make VDI $vdiuuid  visible" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  |   size=$(vhd-util query -s -n /dev/VG_XenStorage-$sruuid/VHD-$vdiuuid) | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "10#can not get physical size of /dev/VG_XenStorage-$sruuid/VHD-$vdiuuid" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  | #in 2M unit | ||||||
|  |   size=$((size>>21)) | ||||||
|  |   size=$((size+1)) | ||||||
|  |   dd if=/dev/VG_XenStorage-$sruuid/VHD-$vdiuuid of=$vhdfile bs=2M count=$size | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     rm -f $vhdfile | ||||||
|  |     echo "8#failed to copy /dev/VG_XenStorage-$sruuid/VHD-$vdiuuid to secondarystorage" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  | #in byte unit | ||||||
|  |   size=$((size<<21)) | ||||||
|  |   vhd-util modify -s $size -n $vhdfile | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     rm -f $vhdfile | ||||||
|  |     echo "11#failed to change $vhdfile physical size" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  | else  | ||||||
|  |   echo "15#doesn't support sr type $type" | ||||||
|  |   cleanup | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | echo "0#$vdiuuid" | ||||||
|  | cleanup | ||||||
|  | exit 0 | ||||||
| @ -0,0 +1,134 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Copyright 2012 Citrix Systems, Inc. Licensed under the | ||||||
|  | # Apache License, Version 2.0 (the "License"); you may not use this | ||||||
|  | # file except in compliance with the License.  Citrix Systems, Inc. | ||||||
|  | # reserves all rights not expressly granted by 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. | ||||||
|  | #  | ||||||
|  | # Automatically generated by addcopyright.py at 04/03/2012 | ||||||
|  | 
 | ||||||
|  | #set -x | ||||||
|  |   | ||||||
|  | usage() { | ||||||
|  |   printf "Usage: %s [vhd file in secondary storage] [template directory in secondary storage] [template local dir] \n" $(basename $0)  | ||||||
|  | } | ||||||
|  | options='tcp,soft,timeo=133,retrans=1' | ||||||
|  | cleanup() | ||||||
|  | { | ||||||
|  |   if [ ! -z $snapshotdir ]; then  | ||||||
|  |     umount $snapshotdir | ||||||
|  |     if [ $? -eq 0 ];  then | ||||||
|  |       rmdir $snapshotdir | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  |   if [ ! -z $templatedir ]; then  | ||||||
|  |     umount $templatedir | ||||||
|  |     if [ $? -eq 0 ];  then | ||||||
|  |       rmdir $templatedir | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if [ -z $1 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "2#no vhd file path" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   snapshoturl=${1%/*} | ||||||
|  |   vhdfilename=${1##*/} | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z $2 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "3#no template path" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   templateurl=$2 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z $3 ]; then | ||||||
|  |   usage | ||||||
|  |   echo "3#no template local dir" | ||||||
|  |   exit 0 | ||||||
|  | else | ||||||
|  |   tmpltLocalDir=$3 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | snapshotdir=/run/cloud_mount/$(uuidgen -r) | ||||||
|  | mkdir -p $snapshotdir | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   echo "4#cann't make dir $snapshotdir" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | mount -o $options $snapshoturl $snapshotdir | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   rmdir $snapshotdir | ||||||
|  |   echo "5#can not mount $snapshoturl to $snapshotdir" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | templatedir=/run/cloud_mount/$tmpltLocalDir | ||||||
|  | mkdir -p $templatedir | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   templatedir="" | ||||||
|  |   cleanup | ||||||
|  |   echo "6#cann't make dir $templatedir" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | mount -o $options $templateurl $templatedir | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |   rmdir $templatedir | ||||||
|  |   templatedir="" | ||||||
|  |   cleanup | ||||||
|  |   echo "7#can not mount $templateurl to $templatedir" | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | VHDUTIL="vhd-util" | ||||||
|  | 
 | ||||||
|  | copyvhd() | ||||||
|  | { | ||||||
|  |   local desvhd=$1 | ||||||
|  |   local srcvhd=$2 | ||||||
|  |   local parent= | ||||||
|  |   parent=`$VHDUTIL query -p -n $srcvhd` | ||||||
|  |   if [ $? -ne 0 ]; then | ||||||
|  |     echo "30#failed to query $srcvhd" | ||||||
|  |     cleanup | ||||||
|  |     exit 0 | ||||||
|  |   fi | ||||||
|  |   if [[ "${parent}"  =~ " no parent" ]]; then | ||||||
|  |     dd if=$srcvhd of=$desvhd bs=2M      | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |       echo "31#failed to dd $srcvhd to $desvhd" | ||||||
|  |       cleanup | ||||||
|  |       exit 0 | ||||||
|  |     fi | ||||||
|  |   else | ||||||
|  |     copyvhd $desvhd $parent | ||||||
|  |     $VHDUTIL coalesce -p $desvhd -n $srcvhd | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |       echo "32#failed to coalesce  $desvhd to $srcvhd" | ||||||
|  |       cleanup | ||||||
|  |       exit 0 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | templateuuid=$(uuidgen -r) | ||||||
|  | desvhd=$templatedir/$templateuuid.vhd | ||||||
|  | srcvhd=$snapshotdir/$vhdfilename | ||||||
|  | copyvhd $desvhd $srcvhd | ||||||
|  | virtualSize=`$VHDUTIL query -v -n $desvhd` | ||||||
|  | physicalSize=`ls -l $desvhd | awk '{print $5}'` | ||||||
|  | cleanup | ||||||
|  | echo "0#$templateuuid#$physicalSize#$virtualSize" | ||||||
|  | exit 0 | ||||||
							
								
								
									
										49
									
								
								scripts/vm/hypervisor/xenserver/xcposs/patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								scripts/vm/hypervisor/xenserver/xcposs/patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | # This file specifies the files that need | ||||||
|  | # to be transferred over to the XenServer. | ||||||
|  | # The format of this file is as follows: | ||||||
|  | # [Name of file]=[source path],[file permission],[destination path] | ||||||
|  | # [destination path] is required. | ||||||
|  | # If [file permission] is missing, 755 is assumed. | ||||||
|  | # If [source path] is missing, it looks in the same | ||||||
|  | # directory as the patch file. | ||||||
|  | # If [source path] starts with '/', then it is absolute path. | ||||||
|  | # If [source path] starts with '~', then it is path relative to management server home directory. | ||||||
|  | # If [source path] does not start with '/' or '~', then it is relative path to the location of the patch file.  | ||||||
|  | NFSSR.py=/usr/lib/xcp/sm | ||||||
|  | vmops=.,0755,/usr/lib/xcp/plugins | ||||||
|  | ovsgre=..,0755,/usr/lib/xcp/plugins | ||||||
|  | ovstunnel=..,0755,/usr/lib/xcp/plugins | ||||||
|  | vmopsSnapshot=.,0755,/usr/lib/xcp/plugins | ||||||
|  | hostvmstats.py=..,0755,/usr/lib/xcp/sm | ||||||
|  | systemvm.iso=../../../../../vms,0644,/usr/share/xcp/packages/iso/ | ||||||
|  | id_rsa.cloud=../../../systemvm,0600,/root/.ssh | ||||||
|  | network_info.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | setupxenserver.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | make_migratable.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | setup_iscsi.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | pingtest.sh=../../..,0755,/usr/lib/xcp/bin | ||||||
|  | dhcp_entry.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | ipassoc.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | vm_data.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | save_password_to_domr.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | networkUsage.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | call_firewall.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | call_loadbalancer.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | l2tp_vpn.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | cloud-setup-bonding.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | copy_vhd_to_secondarystorage.sh=.,0755,/usr/lib/xcp/bin | ||||||
|  | copy_vhd_from_secondarystorage.sh=.,0755,/usr/lib/xcp/bin | ||||||
|  | setup_heartbeat_sr.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | setup_heartbeat_file.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | check_heartbeat.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | xenheartbeat.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | launch_hb.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | vhd-util=..,0755,/usr/lib/xcp/bin | ||||||
|  | vmopspremium=.,0755,/usr/lib/xcp/plugins | ||||||
|  | create_privatetemplate_from_snapshot.sh=.,0755,/usr/lib/xcp/bin | ||||||
|  | upgrade_snapshot.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | cloud-clean-vlan.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | cloud-prepare-upgrade.sh=..,0755,/usr/lib/xcp/bin | ||||||
|  | getRouterStatus.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | bumpUpPriority.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
|  | getDomRVersion.sh=../../../../network/domr/,0755,/usr/lib/xcp/bin | ||||||
							
								
								
									
										1519
									
								
								scripts/vm/hypervisor/xenserver/xcposs/vmops
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1519
									
								
								scripts/vm/hypervisor/xenserver/xcposs/vmops
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										552
									
								
								scripts/vm/hypervisor/xenserver/xcposs/vmopsSnapshot
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										552
									
								
								scripts/vm/hypervisor/xenserver/xcposs/vmopsSnapshot
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,552 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | # Version @VERSION@ | ||||||
|  | # | ||||||
|  | # A plugin for executing script needed by vmops cloud  | ||||||
|  | 
 | ||||||
|  | import os, sys, time | ||||||
|  | import XenAPIPlugin | ||||||
|  | sys.path.append("/usr/lib/xcp/sm/") | ||||||
|  | import SR, VDI, SRCommand, util, lvutil | ||||||
|  | from util import CommandException | ||||||
|  | import vhdutil | ||||||
|  | import shutil | ||||||
|  | import lvhdutil | ||||||
|  | import errno | ||||||
|  | import subprocess | ||||||
|  | import xs_errors | ||||||
|  | import cleanup | ||||||
|  | import stat | ||||||
|  | import random | ||||||
|  | 
 | ||||||
|  | VHD_UTIL = 'vhd-util' | ||||||
|  | VHD_PREFIX = 'VHD-' | ||||||
|  | CLOUD_DIR = '/run/cloud_mount' | ||||||
|  | 
 | ||||||
|  | def echo(fn): | ||||||
|  |     def wrapped(*v, **k): | ||||||
|  |         name = fn.__name__ | ||||||
|  |         util.SMlog("#### VMOPS enter  %s ####" % name ) | ||||||
|  |         res = fn(*v, **k) | ||||||
|  |         util.SMlog("#### VMOPS exit  %s ####" % name ) | ||||||
|  |         return res | ||||||
|  |     return wrapped | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def create_secondary_storage_folder(session, args): | ||||||
|  |     local_mount_path = None | ||||||
|  | 
 | ||||||
|  |     util.SMlog("create_secondary_storage_folder, args: " + str(args)) | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         try: | ||||||
|  |             # Mount the remote resource folder locally | ||||||
|  |             remote_mount_path = args["remoteMountPath"] | ||||||
|  |             local_mount_path = os.path.join(CLOUD_DIR, util.gen_uuid()) | ||||||
|  |             mount(remote_mount_path, local_mount_path) | ||||||
|  | 
 | ||||||
|  |             # Create the new folder | ||||||
|  |             new_folder = local_mount_path + "/" + args["newFolder"] | ||||||
|  |             if not os.path.isdir(new_folder): | ||||||
|  |                 current_umask = os.umask(0) | ||||||
|  |                 os.makedirs(new_folder) | ||||||
|  |                 os.umask(current_umask) | ||||||
|  |         except OSError, (errno, strerror): | ||||||
|  |             errMsg = "create_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror | ||||||
|  |             util.SMlog(errMsg) | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  |         except: | ||||||
|  |             errMsg = "create_secondary_storage_folder failed." | ||||||
|  |             util.SMlog(errMsg) | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  |     finally: | ||||||
|  |         if local_mount_path != None: | ||||||
|  |             # Unmount the local folder | ||||||
|  |             umount(local_mount_path) | ||||||
|  |             # Remove the local folder | ||||||
|  |             os.system("rmdir " + local_mount_path) | ||||||
|  |          | ||||||
|  |     return "1" | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def delete_secondary_storage_folder(session, args): | ||||||
|  |     local_mount_path = None | ||||||
|  | 
 | ||||||
|  |     util.SMlog("delete_secondary_storage_folder, args: " + str(args)) | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         try: | ||||||
|  |             # Mount the remote resource folder locally | ||||||
|  |             remote_mount_path = args["remoteMountPath"] | ||||||
|  |             local_mount_path = os.path.join(CLOUD_DIR, util.gen_uuid()) | ||||||
|  |             mount(remote_mount_path, local_mount_path) | ||||||
|  | 
 | ||||||
|  |             # Delete the specified folder | ||||||
|  |             folder = local_mount_path + "/" + args["folder"] | ||||||
|  |             if os.path.isdir(folder): | ||||||
|  |                 os.system("rm -f " + folder + "/*") | ||||||
|  |                 os.system("rmdir " + folder) | ||||||
|  |         except OSError, (errno, strerror): | ||||||
|  |             errMsg = "delete_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror | ||||||
|  |             util.SMlog(errMsg) | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  |         except: | ||||||
|  |             errMsg = "delete_secondary_storage_folder failed." | ||||||
|  |             util.SMlog(errMsg) | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  |     finally: | ||||||
|  |         if local_mount_path != None: | ||||||
|  |             # Unmount the local folder | ||||||
|  |             umount(local_mount_path) | ||||||
|  |             # Remove the local folder | ||||||
|  |             os.system("rmdir " + local_mount_path) | ||||||
|  |          | ||||||
|  |     return "1" | ||||||
|  |       | ||||||
|  | @echo | ||||||
|  | def post_create_private_template(session, args): | ||||||
|  |     local_mount_path = None | ||||||
|  |     try: | ||||||
|  |         try: | ||||||
|  |             # get local template folder  | ||||||
|  |             templatePath = args["templatePath"] | ||||||
|  |             local_mount_path = os.path.join(CLOUD_DIR, util.gen_uuid()) | ||||||
|  |             mount(templatePath, local_mount_path) | ||||||
|  |             # Retrieve args | ||||||
|  |             filename = args["templateFilename"] | ||||||
|  |             name = args["templateName"] | ||||||
|  |             description = args["templateDescription"] | ||||||
|  |             checksum = args["checksum"] | ||||||
|  |             file_size = args["size"] | ||||||
|  |             virtual_size = args["virtualSize"] | ||||||
|  |             template_id = args["templateId"] | ||||||
|  |             | ||||||
|  |             # Create the template.properties file | ||||||
|  |             template_properties_install_path = local_mount_path + "/template.properties" | ||||||
|  |             f = open(template_properties_install_path, "w") | ||||||
|  |             f.write("filename=" + filename + "\n") | ||||||
|  |             f.write("vhd=true\n") | ||||||
|  |             f.write("id=" + template_id + "\n") | ||||||
|  |             f.write("vhd.filename=" + filename + "\n") | ||||||
|  |             f.write("public=false\n") | ||||||
|  |             f.write("uniquename=" + name + "\n") | ||||||
|  |             f.write("vhd.virtualsize=" + virtual_size + "\n") | ||||||
|  |             f.write("virtualsize=" + virtual_size + "\n") | ||||||
|  |             f.write("checksum=" + checksum + "\n") | ||||||
|  |             f.write("hvm=true\n") | ||||||
|  |             f.write("description=" + description + "\n") | ||||||
|  |             f.write("vhd.size=" + str(file_size) + "\n") | ||||||
|  |             f.write("size=" + str(file_size) + "\n") | ||||||
|  |             f.close() | ||||||
|  |             util.SMlog("Created template.properties file") | ||||||
|  |             | ||||||
|  |             # Set permissions | ||||||
|  |             permissions = stat.S_IREAD | stat.S_IWRITE | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH | ||||||
|  |             os.chmod(template_properties_install_path, permissions) | ||||||
|  |             util.SMlog("Set permissions on template and template.properties") | ||||||
|  | 
 | ||||||
|  |         except: | ||||||
|  |             errMsg = "post_create_private_template failed." | ||||||
|  |             util.SMlog(errMsg) | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  | 
 | ||||||
|  |     finally: | ||||||
|  |         if local_mount_path != None: | ||||||
|  |             # Unmount the local folder | ||||||
|  |             umount(local_mount_path) | ||||||
|  |             # Remove the local folder | ||||||
|  |             os.system("rmdir " + local_mount_path) | ||||||
|  |     return "1"  | ||||||
|  |    | ||||||
|  | def isfile(path, isISCSI): | ||||||
|  |     errMsg = '' | ||||||
|  |     exists = True | ||||||
|  |     if isISCSI: | ||||||
|  |         exists = checkVolumeAvailablility(path) | ||||||
|  |     else: | ||||||
|  |         exists = os.path.isfile(path) | ||||||
|  |          | ||||||
|  |     if not exists: | ||||||
|  |         errMsg = "File " + path + " does not exist." | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     return errMsg | ||||||
|  | 
 | ||||||
|  | def copyfile(fromFile, toFile, isISCSI): | ||||||
|  |     util.SMlog("Starting to copy " + fromFile + " to " + toFile) | ||||||
|  |     errMsg = '' | ||||||
|  |     try: | ||||||
|  |         cmd = ['dd', 'if=' + fromFile, 'of=' + toFile, 'bs=4M'] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         try: | ||||||
|  |             os.system("rm -f " + toFile) | ||||||
|  |         except: | ||||||
|  |             txt = '' | ||||||
|  |         txt = '' | ||||||
|  |         errMsg = "Error while copying " + fromFile + " to " + toFile + " in secondary storage" | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  | 
 | ||||||
|  |     util.SMlog("Successfully copied " + fromFile + " to " + toFile) | ||||||
|  |     return errMsg | ||||||
|  | 
 | ||||||
|  | def chdir(path): | ||||||
|  |     try: | ||||||
|  |         os.chdir(path) | ||||||
|  |     except OSError, (errno, strerror): | ||||||
|  |         errMsg = "Unable to chdir to " + path + " because of OSError with errno: " + str(errno) + " and strerr: " + strerror | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     util.SMlog("Chdired to " + path) | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def scanParent(path): | ||||||
|  |     # Do a scan for the parent for ISCSI volumes | ||||||
|  |     # Note that the parent need not be visible on the XenServer | ||||||
|  |     parentUUID = '' | ||||||
|  |     try: | ||||||
|  |         lvName = os.path.basename(path) | ||||||
|  |         dirname = os.path.dirname(path) | ||||||
|  |         vgName = os.path.basename(dirname)  | ||||||
|  |         vhdInfo = vhdutil.getVHDInfoLVM(lvName, lvhdutil.extractUuid, vgName) | ||||||
|  |         parentUUID = vhdInfo.parentUuid | ||||||
|  |     except: | ||||||
|  |         errMsg = "Could not get vhd parent of " + path | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     return parentUUID | ||||||
|  | 
 | ||||||
|  | def getParent(path, isISCSI): | ||||||
|  |     parentUUID = '' | ||||||
|  |     try : | ||||||
|  |         if isISCSI: | ||||||
|  |             parentUUID = vhdutil.getParent(path, lvhdutil.extractUuid) | ||||||
|  |         else: | ||||||
|  |             parentUUID = vhdutil.getParent(path, cleanup.FileVDI.extractUuid) | ||||||
|  |     except: | ||||||
|  |         errMsg = "Could not get vhd parent of " + path | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     return parentUUID | ||||||
|  | 
 | ||||||
|  | def getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI): | ||||||
|  |     snapshotVHD    = getVHD(snapshotUuid, isISCSI) | ||||||
|  |     snapshotPath   = os.path.join(primarySRPath, snapshotVHD) | ||||||
|  | 
 | ||||||
|  |     baseCopyUuid = '' | ||||||
|  |     if isISCSI: | ||||||
|  |         checkVolumeAvailablility(snapshotPath) | ||||||
|  |         baseCopyUuid = scanParent(snapshotPath) | ||||||
|  |     else: | ||||||
|  |         baseCopyUuid = getParent(snapshotPath, isISCSI) | ||||||
|  |      | ||||||
|  |     util.SMlog("Base copy of snapshotUuid: " + snapshotUuid + " is " + baseCopyUuid) | ||||||
|  |     return baseCopyUuid | ||||||
|  | 
 | ||||||
|  | def setParent(parent, child): | ||||||
|  |     try: | ||||||
|  |         cmd = [VHD_UTIL, "modify", "-p", parent, "-n", child] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         errMsg = "Unexpected error while trying to set parent of " + child + " to " + parent  | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     util.SMlog("Successfully set parent of " + child + " to " + parent) | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def rename(originalVHD, newVHD): | ||||||
|  |     try: | ||||||
|  |         os.rename(originalVHD, newVHD) | ||||||
|  |     except OSError, (errno, strerror): | ||||||
|  |         errMsg = "OSError while renaming " + origiinalVHD + " to " + newVHD + "with errno: " + str(errno) + " and strerr: " + strerror | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def makedirs(path): | ||||||
|  |     if not os.path.isdir(path): | ||||||
|  |         try: | ||||||
|  |             os.makedirs(path) | ||||||
|  |         except OSError, (errno, strerror): | ||||||
|  |             umount(path) | ||||||
|  |             if os.path.isdir(path): | ||||||
|  |                 return | ||||||
|  |             errMsg = "OSError while creating " + path + " with errno: " + str(errno) + " and strerr: " + strerror | ||||||
|  |             util.SMlog(errMsg) | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def mount(remoteDir, localDir): | ||||||
|  |     makedirs(localDir) | ||||||
|  |     options = "soft,tcp,timeo=133,retrans=1" | ||||||
|  |     try:  | ||||||
|  |         cmd = ['mount', '-o', options, remoteDir, localDir] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '' | ||||||
|  |         errMsg = "Unexpected error while trying to mount " + remoteDir + " to " + localDir  | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |     util.SMlog("Successfully mounted " + remoteDir + " to " + localDir) | ||||||
|  | 
 | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def umount(localDir): | ||||||
|  |     try:  | ||||||
|  |         cmd = ['umount', localDir] | ||||||
|  |         util.pread2(cmd) | ||||||
|  |     except CommandException: | ||||||
|  |         errMsg = "CommandException raised while trying to umount " + localDir  | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  | 
 | ||||||
|  |     util.SMlog("Successfully unmounted " + localDir) | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def mountSnapshotsDir(secondaryStorageMountPath, relativeDir, dcId, accountId, instanceId): | ||||||
|  |     # The aim is to mount secondaryStorageMountPath on  | ||||||
|  |     # And create <accountId>/<instanceId> dir on it, if it doesn't exist already. | ||||||
|  |     # Assuming that secondaryStorageMountPath  exists remotely | ||||||
|  | 
 | ||||||
|  |     # Alex's suggestion and currently implemented: | ||||||
|  |     # Just mount secondaryStorageMountPath/<relativeDir> everytime | ||||||
|  |     # Never unmount. | ||||||
|  |     snapshotsDir = os.path.join(secondaryStorageMountPath, relativeDir) | ||||||
|  | 
 | ||||||
|  |     # Mkdir local mount point dir, if it doesn't exist. | ||||||
|  |     localMountPointPath = os.path.join(CLOUD_DIR, dcId) | ||||||
|  |     localMountPointPath = os.path.join(localMountPointPath, relativeDir) | ||||||
|  | 
 | ||||||
|  |     makedirs(localMountPointPath) | ||||||
|  |     # if something is not mounted already on localMountPointPath,  | ||||||
|  |     # mount secondaryStorageMountPath on localMountPath | ||||||
|  |     if os.path.ismount(localMountPointPath): | ||||||
|  |         # There is only one secondary storage per zone.  | ||||||
|  |         # And we are mounting each sec storage under a zone-specific directory | ||||||
|  |         # So two secondary storage snapshot dirs will never get mounted on the same point on the same XenServer. | ||||||
|  |         util.SMlog("The remote snapshots directory has already been mounted on " + localMountPointPath) | ||||||
|  |     else: | ||||||
|  |         mount(snapshotsDir, localMountPointPath) | ||||||
|  | 
 | ||||||
|  |     # Create accountId/instanceId dir on localMountPointPath, if it doesn't exist | ||||||
|  |     backupsDir = os.path.join(localMountPointPath, accountId) | ||||||
|  |     backupsDir = os.path.join(backupsDir, instanceId) | ||||||
|  |     makedirs(backupsDir) | ||||||
|  |     return backupsDir | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def unmountSnapshotsDir(session, args): | ||||||
|  |     dcId = args['dcId'] | ||||||
|  |     localMountPointPath = os.path.join(CLOUD_DIR, dcId) | ||||||
|  |     localMountPointPath = os.path.join(localMountPointPath, "snapshots") | ||||||
|  |     try: | ||||||
|  |         umount(localMountPointPath) | ||||||
|  |     except: | ||||||
|  |         util.SMlog("Ignoring the error while trying to unmount the snapshots dir.") | ||||||
|  | 
 | ||||||
|  |     return "1" | ||||||
|  | 
 | ||||||
|  | def getPrimarySRPath(session, primaryStorageSRUuid, isISCSI): | ||||||
|  |     sr = session.xenapi.SR.get_by_uuid(primaryStorageSRUuid) | ||||||
|  |     srrec = session.xenapi.SR.get_record(sr) | ||||||
|  |     srtype = srrec["type"] | ||||||
|  |     if srtype == "file": | ||||||
|  |         pbd = session.xenapi.SR.get_PBDs(sr)[0] | ||||||
|  |         pbdrec = session.xenapi.PBD.get_record(pbd) | ||||||
|  |         primarySRPath = pbdrec["device_config"]["location"] | ||||||
|  |         return primarySRPath | ||||||
|  |     if isISCSI: | ||||||
|  |         primarySRDir = lvhdutil.VG_PREFIX + primaryStorageSRUuid | ||||||
|  |         return os.path.join(lvhdutil.VG_LOCATION, primarySRDir) | ||||||
|  |     else: | ||||||
|  |         return os.path.join(SR.MOUNT_BASE, primaryStorageSRUuid) | ||||||
|  | 
 | ||||||
|  | def getBackupVHD(UUID): | ||||||
|  |     return UUID + '.' + SR.DEFAULT_TAP | ||||||
|  | 
 | ||||||
|  | def getVHD(UUID, isISCSI): | ||||||
|  |     if isISCSI: | ||||||
|  |         return VHD_PREFIX + UUID | ||||||
|  |     else: | ||||||
|  |         return UUID + '.' + SR.DEFAULT_TAP | ||||||
|  | 
 | ||||||
|  | def getIsTrueString(stringValue): | ||||||
|  |     booleanValue = False | ||||||
|  |     if (stringValue and stringValue == 'true'): | ||||||
|  |         booleanValue = True | ||||||
|  |     return booleanValue  | ||||||
|  | 
 | ||||||
|  | def makeUnavailable(uuid, primarySRPath, isISCSI): | ||||||
|  |     if not isISCSI: | ||||||
|  |         return | ||||||
|  |     VHD = getVHD(uuid, isISCSI) | ||||||
|  |     path = os.path.join(primarySRPath, VHD) | ||||||
|  |     manageAvailability(path, '-an') | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | def manageAvailability(path, value): | ||||||
|  |     if path.__contains__("/var/run/sr-mount"): | ||||||
|  |         return | ||||||
|  |     util.SMlog("Setting availability of " + path + " to " + value) | ||||||
|  |     try: | ||||||
|  |         cmd = ['/usr/sbin/lvchange', value, path] | ||||||
|  |         util.pread2(cmd) | ||||||
|  |     except: #CommandException, (rc, cmdListStr, stderr): | ||||||
|  |         #errMsg = "CommandException thrown while executing: " + cmdListStr + " with return code: " + str(rc) + " and stderr: " + stderr | ||||||
|  |         errMsg = "Unexpected exception thrown by lvchange" | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         if value == "-ay": | ||||||
|  |             # Raise an error only if we are trying to make it available. | ||||||
|  |             # Just warn if we are trying to make it unavailable after the  | ||||||
|  |             # snapshot operation is done. | ||||||
|  |             raise xs_errors.XenError(errMsg) | ||||||
|  |     return | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def checkVolumeAvailablility(path): | ||||||
|  |     try: | ||||||
|  |         if not isVolumeAvailable(path): | ||||||
|  |             # The VHD file is not available on XenSever. The volume is probably | ||||||
|  |             # inactive or detached. | ||||||
|  |             # Do lvchange -ay to make it available on XenServer | ||||||
|  |             manageAvailability(path, '-ay') | ||||||
|  |     except: | ||||||
|  |         errMsg = "Could not determine status of ISCSI path: " + path | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  |      | ||||||
|  |     success = False | ||||||
|  |     i = 0 | ||||||
|  |     while i < 6: | ||||||
|  |         i = i + 1 | ||||||
|  |         # Check if the vhd is actually visible by checking for the link | ||||||
|  |         # set isISCSI to true | ||||||
|  |         success = isVolumeAvailable(path) | ||||||
|  |         if success: | ||||||
|  |             util.SMlog("Made vhd: " + path + " available and confirmed that it is visible") | ||||||
|  |             break | ||||||
|  | 
 | ||||||
|  |         # Sleep for 10 seconds before checking again. | ||||||
|  |         time.sleep(10) | ||||||
|  | 
 | ||||||
|  |     # If not visible within 1 min fail | ||||||
|  |     if not success: | ||||||
|  |         util.SMlog("Could not make vhd: " +  path + " available despite waiting for 1 minute. Does it exist?") | ||||||
|  | 
 | ||||||
|  |     return success | ||||||
|  | 
 | ||||||
|  | def isVolumeAvailable(path): | ||||||
|  |     # Check if iscsi volume is available on this XenServer. | ||||||
|  |     status = "0" | ||||||
|  |     try: | ||||||
|  |         p = subprocess.Popen(["/bin/bash", "-c", "if [ -L " + path + " ]; then echo 1; else echo 0;fi"], stdout=subprocess.PIPE) | ||||||
|  |         status = p.communicate()[0].strip("\n") | ||||||
|  |     except: | ||||||
|  |         errMsg = "Could not determine status of ISCSI path: " + path | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  | 
 | ||||||
|  |     return (status == "1")   | ||||||
|  | 
 | ||||||
|  | def getVhdParent(session, args): | ||||||
|  |     util.SMlog("getParent with " + str(args)) | ||||||
|  |     primaryStorageSRUuid      = args['primaryStorageSRUuid'] | ||||||
|  |     snapshotUuid              = args['snapshotUuid'] | ||||||
|  |     isISCSI                   = getIsTrueString(args['isISCSI'])  | ||||||
|  | 
 | ||||||
|  |     primarySRPath = getPrimarySRPath(session, primaryStorageSRUuid, isISCSI) | ||||||
|  |     util.SMlog("primarySRPath: " + primarySRPath) | ||||||
|  | 
 | ||||||
|  |     baseCopyUuid = getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI) | ||||||
|  | 
 | ||||||
|  |     return  baseCopyUuid | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def backupSnapshot(session, args): | ||||||
|  |     util.SMlog("Called backupSnapshot with " + str(args)) | ||||||
|  |     primaryStorageSRUuid      = args['primaryStorageSRUuid'] | ||||||
|  |     dcId                      = args['dcId'] | ||||||
|  |     accountId                 = args['accountId'] | ||||||
|  |     volumeId                  = args['volumeId'] | ||||||
|  |     secondaryStorageMountPath = args['secondaryStorageMountPath'] | ||||||
|  |     snapshotUuid              = args['snapshotUuid'] | ||||||
|  |     prevBackupUuid            = args['prevBackupUuid'] | ||||||
|  |     backupUuid                = args['backupUuid'] | ||||||
|  |     isISCSI                   = getIsTrueString(args['isISCSI'])  | ||||||
|  | 
 | ||||||
|  |     primarySRPath = getPrimarySRPath(session, primaryStorageSRUuid, isISCSI) | ||||||
|  |     util.SMlog("primarySRPath: " + primarySRPath) | ||||||
|  | 
 | ||||||
|  |     baseCopyUuid = getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI) | ||||||
|  |     baseCopyVHD  = getVHD(baseCopyUuid, isISCSI) | ||||||
|  |     baseCopyPath = os.path.join(primarySRPath, baseCopyVHD) | ||||||
|  |     util.SMlog("Base copy path: " + baseCopyPath) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     # Mount secondary storage mount path on XenServer along the path | ||||||
|  |     # /var/run/sr-mount/<dcId>/snapshots/ and create <accountId>/<volumeId> dir | ||||||
|  |     # on it. | ||||||
|  |     backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) | ||||||
|  |     util.SMlog("Backups dir " + backupsDir) | ||||||
|  | 
 | ||||||
|  |     # Check existence of snapshot on primary storage  | ||||||
|  |     isfile(baseCopyPath, isISCSI) | ||||||
|  |     if prevBackupUuid: | ||||||
|  |         # Check existence of prevBackupFile | ||||||
|  |         prevBackupVHD = getBackupVHD(prevBackupUuid) | ||||||
|  |         prevBackupFile = os.path.join(backupsDir, prevBackupVHD) | ||||||
|  |         isfile(prevBackupFile, False) | ||||||
|  | 
 | ||||||
|  |     # copy baseCopyPath to backupsDir with new uuid | ||||||
|  |     backupVHD = getBackupVHD(backupUuid)   | ||||||
|  |     backupFile = os.path.join(backupsDir, backupVHD) | ||||||
|  |     util.SMlog("Back up " + baseCopyUuid + " to Secondary Storage as " + backupUuid) | ||||||
|  |     copyfile(baseCopyPath, backupFile, isISCSI) | ||||||
|  |     vhdutil.setHidden(backupFile, False) | ||||||
|  | 
 | ||||||
|  |     # Because the primary storage is always scanned, the parent of this base copy is always the first base copy. | ||||||
|  |     # We don't want that, we want a chain of VHDs each of which is a delta from the previous. | ||||||
|  |     # So set the parent of the current baseCopyVHD to prevBackupVHD  | ||||||
|  |     if prevBackupUuid: | ||||||
|  |         # If there was a previous snapshot | ||||||
|  |         setParent(prevBackupFile, backupFile) | ||||||
|  | 
 | ||||||
|  |     txt = "1#" + backupUuid | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def deleteSnapshotBackup(session, args): | ||||||
|  |     util.SMlog("Calling deleteSnapshotBackup with " + str(args)) | ||||||
|  |     dcId                      = args['dcId'] | ||||||
|  |     accountId                 = args['accountId'] | ||||||
|  |     volumeId                  = args['volumeId'] | ||||||
|  |     secondaryStorageMountPath = args['secondaryStorageMountPath'] | ||||||
|  |     backupUUID                = args['backupUUID'] | ||||||
|  | 
 | ||||||
|  |     backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) | ||||||
|  |     # chdir to the backupsDir for convenience | ||||||
|  |     chdir(backupsDir) | ||||||
|  | 
 | ||||||
|  |     backupVHD = getBackupVHD(backupUUID) | ||||||
|  |     util.SMlog("checking existence of " + backupVHD) | ||||||
|  | 
 | ||||||
|  |     # The backupVHD is on secondary which is NFS and not ISCSI. | ||||||
|  |     if not os.path.isfile(backupVHD): | ||||||
|  |         util.SMlog("backupVHD " + backupVHD + "does not exist. Not trying to delete it") | ||||||
|  |         return "1" | ||||||
|  |     util.SMlog("backupVHD " + backupVHD + " exists.") | ||||||
|  |          | ||||||
|  |     # Just delete the backupVHD | ||||||
|  |     try: | ||||||
|  |         os.remove(backupVHD) | ||||||
|  |     except OSError, (errno, strerror): | ||||||
|  |         errMsg = "OSError while removing " + backupVHD + " with errno: " + str(errno) + " and strerr: " + strerror | ||||||
|  |         util.SMlog(errMsg) | ||||||
|  |         raise xs_errors.XenError(errMsg) | ||||||
|  | 
 | ||||||
|  |     return "1" | ||||||
|  |     | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     XenAPIPlugin.dispatch({"getVhdParent":getVhdParent,  "create_secondary_storage_folder":create_secondary_storage_folder, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template":post_create_private_template, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "unmountSnapshotsDir": unmountSnapshotsDir}) | ||||||
|  | 
 | ||||||
							
								
								
									
										129
									
								
								scripts/vm/hypervisor/xenserver/xcposs/vmopspremium
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								scripts/vm/hypervisor/xenserver/xcposs/vmopspremium
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,129 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | # Version @VERSION@ | ||||||
|  | # | ||||||
|  | # A plugin for executing script needed by vmops cloud  | ||||||
|  | 
 | ||||||
|  | import os, sys, time | ||||||
|  | import XenAPIPlugin | ||||||
|  | sys.path.append("/usr/lib/xcp/sm/") | ||||||
|  | import util | ||||||
|  | import socket | ||||||
|  | 
 | ||||||
|  | def echo(fn): | ||||||
|  |     def wrapped(*v, **k): | ||||||
|  |         name = fn.__name__ | ||||||
|  |         util.SMlog("#### VMOPS enter  %s ####" % name ) | ||||||
|  |         res = fn(*v, **k) | ||||||
|  |         util.SMlog("#### VMOPS exit  %s ####" % name ) | ||||||
|  |         return res | ||||||
|  |     return wrapped | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def forceShutdownVM(session, args): | ||||||
|  |     domId = args['domId'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["/usr/lib/xcp/debug/xenops", "destroy_domain", "-domid", domId] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '10#failed' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def create_privatetemplate_from_snapshot(session, args): | ||||||
|  |     templatePath = args['templatePath'] | ||||||
|  |     snapshotPath = args['snapshotPath'] | ||||||
|  |     tmpltLocalDir = args['tmpltLocalDir'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["bash", "/usr/lib/xcp/bin/create_privatetemplate_from_snapshot.sh",snapshotPath, templatePath, tmpltLocalDir] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '10#failed' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def upgrade_snapshot(session, args): | ||||||
|  |     templatePath = args['templatePath'] | ||||||
|  |     snapshotPath = args['snapshotPath'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["bash", "/usr/lib/xcp/bin/upgrate_snapshot.sh",snapshotPath, templatePath] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '10#failed' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def copy_vhd_to_secondarystorage(session, args): | ||||||
|  |     mountpoint = args['mountpoint'] | ||||||
|  |     vdiuuid = args['vdiuuid'] | ||||||
|  |     sruuid = args['sruuid'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["bash", "/usr/lib/xcp/bin/copy_vhd_to_secondarystorage.sh", mountpoint, vdiuuid, sruuid] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '10#failed' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def copy_vhd_from_secondarystorage(session, args): | ||||||
|  |     mountpoint = args['mountpoint'] | ||||||
|  |     sruuid = args['sruuid'] | ||||||
|  |     namelabel = args['namelabel'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["bash", "/usr/lib/xcp/bin/copy_vhd_from_secondarystorage.sh", mountpoint, sruuid, namelabel] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '10#failed' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def setup_heartbeat_sr(session, args): | ||||||
|  |     host = args['host'] | ||||||
|  |     sr = args['sr'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["bash", "/usr/lib/xcp/bin/setup_heartbeat_sr.sh", host, sr] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def setup_heartbeat_file(session, args): | ||||||
|  |     host = args['host'] | ||||||
|  |     sr = args['sr'] | ||||||
|  |     add = args['add'] | ||||||
|  |     try: | ||||||
|  |         cmd = ["bash", "/usr/lib/xcp/bin/setup_heartbeat_file.sh", host, sr, add] | ||||||
|  |         txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |         txt = '' | ||||||
|  |     return txt | ||||||
|  | 
 | ||||||
|  | @echo | ||||||
|  | def check_heartbeat(session, args): | ||||||
|  |     host = args['host'] | ||||||
|  |     interval = args['interval'] | ||||||
|  |     try: | ||||||
|  |        cmd = ["bash", "/usr/lib/xcp/bin/check_heartbeat.sh", host, interval] | ||||||
|  |        txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |        txt='' | ||||||
|  |     return txt | ||||||
|  |      | ||||||
|  |     | ||||||
|  | @echo | ||||||
|  | def heartbeat(session, args): | ||||||
|  |     ''' | ||||||
|  |     host = args['host'] | ||||||
|  |     interval = args['interval'] | ||||||
|  |     try:  | ||||||
|  |        cmd = ["/bin/bash", "/usr/lib/xcp/bin/launch_hb.sh", host, interval] | ||||||
|  |        txt = util.pread2(cmd) | ||||||
|  |     except: | ||||||
|  |        txt='fail' | ||||||
|  |     ''' | ||||||
|  |     return '> DONE <' | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     XenAPIPlugin.dispatch({"forceShutdownVM":forceShutdownVM, "upgrade_snapshot":upgrade_snapshot, "create_privatetemplate_from_snapshot":create_privatetemplate_from_snapshot, "copy_vhd_to_secondarystorage":copy_vhd_to_secondarystorage, "copy_vhd_from_secondarystorage":copy_vhd_from_secondarystorage, "setup_heartbeat_sr":setup_heartbeat_sr, "setup_heartbeat_file":setup_heartbeat_file, "check_heartbeat":check_heartbeat, "heartbeat": heartbeat}) | ||||||
|  | 
 | ||||||
| @ -1508,7 +1508,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx | |||||||
|                 throw new ConfigurationException(msg); |                 throw new ConfigurationException(msg); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             _serviceOffering = new ServiceOfferingVO("System Offering For Console Proxy", 1, DEFAULT_PROXY_VM_RAMSIZE, DEFAULT_PROXY_VM_CPUMHZ, 0, 0, false, null, useLocalStorage, true, null, true, VirtualMachine.Type.ConsoleProxy, true); |         	int ramSize = NumbersUtil.parseInt(_configDao.getValue("console.ram.size"), DEFAULT_PROXY_VM_RAMSIZE); | ||||||
|  |         	int cpuFreq = NumbersUtil.parseInt(_configDao.getValue("console.cpu.mhz"), DEFAULT_PROXY_VM_CPUMHZ); | ||||||
|  |             _serviceOffering = new ServiceOfferingVO("System Offering For Console Proxy", 1, ramSize, cpuFreq, 0, 0, false, null, useLocalStorage, true, null, true, VirtualMachine.Type.ConsoleProxy, true); | ||||||
|             _serviceOffering.setUniqueName(ServiceOffering.consoleProxyDefaultOffUniqueName); |             _serviceOffering.setUniqueName(ServiceOffering.consoleProxyDefaultOffUniqueName); | ||||||
|             _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); |             _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -603,8 +603,8 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian | |||||||
|         final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params); |         final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params); | ||||||
| 
 | 
 | ||||||
|         _mgmt_host = configs.get("host"); |         _mgmt_host = configs.get("host"); | ||||||
|         _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE); |         _routerRamSize = NumbersUtil.parseInt(_configDao.getValue("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE); | ||||||
|         _routerCpuMHz = NumbersUtil.parseInt(configs.get("router.cpu.mhz"), DEFAULT_ROUTER_CPU_MHZ); |         _routerCpuMHz = NumbersUtil.parseInt(_configDao.getValue("router.cpu.mhz"), DEFAULT_ROUTER_CPU_MHZ); | ||||||
| 
 | 
 | ||||||
|         _routerExtraPublicNics = NumbersUtil.parseInt(_configDao.getValue(Config.RouterExtraPublicNics.key()), 2); |         _routerExtraPublicNics = NumbersUtil.parseInt(_configDao.getValue(Config.RouterExtraPublicNics.key()), 2); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -841,8 +841,10 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V | |||||||
|                 throw new ConfigurationException(msg); |                 throw new ConfigurationException(msg); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|  |         	int ramSize = NumbersUtil.parseInt(_configDao.getValue("ssvm.ram.size"), DEFAULT_SS_VM_RAMSIZE); | ||||||
|  |         	int cpuFreq = NumbersUtil.parseInt(_configDao.getValue("ssvm.cpu.mhz"), DEFAULT_SS_VM_CPUMHZ); | ||||||
|             _useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); |             _useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); | ||||||
|             _serviceOffering = new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, DEFAULT_SS_VM_RAMSIZE, DEFAULT_SS_VM_CPUMHZ, null, null, false, null, _useLocalStorage, true, null, true, VirtualMachine.Type.SecondaryStorageVm, true); |             _serviceOffering = new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, ramSize, cpuFreq, null, null, false, null, _useLocalStorage, true, null, true, VirtualMachine.Type.SecondaryStorageVm, true); | ||||||
|             _serviceOffering.setUniqueName(ServiceOffering.ssvmDefaultOffUniqueName); |             _serviceOffering.setUniqueName(ServiceOffering.ssvmDefaultOffUniqueName); | ||||||
|             _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); |             _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); | ||||||
|              |              | ||||||
|  | |||||||
| @ -330,6 +330,8 @@ public class DatabaseConfig { | |||||||
|         s_defaultConfigurationValues.put("system.vm.use.local.storage", "false"); |         s_defaultConfigurationValues.put("system.vm.use.local.storage", "false"); | ||||||
|         s_defaultConfigurationValues.put("use.local.storage", "false"); |         s_defaultConfigurationValues.put("use.local.storage", "false"); | ||||||
|         s_defaultConfigurationValues.put("init", "false"); |         s_defaultConfigurationValues.put("init", "false"); | ||||||
|  |         s_defaultConfigurationValues.put("cpu.overprovisioning.factor", "1"); | ||||||
|  |         s_defaultConfigurationValues.put("mem.overprovisioning.factor", "1"); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     protected DatabaseConfig() { |     protected DatabaseConfig() { | ||||||
|  | |||||||
							
								
								
									
										33
									
								
								setup/db/clouddev.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								setup/db/clouddev.sql
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | -- 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. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | UPDATE `cloud`.`configuration` SET value = 'true' where name = 'use.local.storage'; | ||||||
|  | UPDATE `cloud`.`configuration` SET value = 'true' where name = 'system.vm.use.local.storage'; | ||||||
|  | INSERT INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, use_local_storage, type) VALUES (17, 'tinyOffering', UUID(), 'tinyOffering', NOW(), 1, 'Service'); | ||||||
|  | INSERT INTO `cloud`.`service_offering` (id, cpu, speed, ram_size) VALUES (17, 1, 100, 100); | ||||||
|  | INSERT INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, type, disk_size) VALUES (18, 'tinyDiskOffering', UUID(), 'tinyDiskOffering', NOW(), 'Disk', 1073741824); | ||||||
|  | INSERT INTO `cloud`.`configuration` (name,value) VALUE('router.ram.size', '100'); | ||||||
|  | INSERT INTO `cloud`.`configuration` (name,value) VALUE('router.cpu.mhz','100'); | ||||||
|  | INSERT INTO `cloud`.`configuration` (name,value) VALUE('console.ram.size','100'); | ||||||
|  | INSERT INTO `cloud`.`configuration` (name,value) VALUE('console.cpu.mhz', '100'); | ||||||
|  | INSERT INTO `cloud`.`configuration` (name,value) VALUE('ssvm.ram.size','100'); | ||||||
|  | INSERT INTO `cloud`.`configuration` (name,value) VALUE('ssvm.cpu.mhz','100'); | ||||||
|  | UPDATE `cloud`.`configuration` SET value='10' where name = 'storage.overprovisioning.factor'; | ||||||
|  | UPDATE `cloud`.`configuration` SET value='10' where name = 'cpu.overprovisioning.factor'; | ||||||
|  | UPDATE `cloud`.`configuration` SET value='10' where name = 'mem.overprovisioning.factor'; | ||||||
|  | UPDATE `cloud`.`vm_template` SET unique_name="tiny Linux",name="tiny Linux",url="http://nfs1.lab.vmops.com/templates/ttylinux_pv.vhd",checksum="046e134e642e6d344b34648223ba4bc1",display_text="tiny Linux" where id=5; | ||||||
							
								
								
									
										23
									
								
								setup/db/deploy-db-clouddev.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								setup/db/deploy-db-clouddev.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # 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. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | mysql --user=cloud --password=cloud < clouddev.sql | ||||||
|  | if [ $? -ne 0 ]; then | ||||||
|  |    printf "failed to init cloudev db" | ||||||
|  | fi | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user