You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ya...@apache.org on 2014/01/22 03:59:40 UTC
git commit: updated refs/heads/master to 1767dda
Updated Branches:
refs/heads/master b79f949e1 -> 1767ddac7
CLOUDSTACK-5779: Update vmdata command in Vmware
To use Gson rather than copy a file to it, follow the same as Xen and KVM.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1767ddac
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1767ddac
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1767ddac
Branch: refs/heads/master
Commit: 1767ddac77ecc32bb649905259723b914f7b20d3
Parents: b79f949
Author: Sheng Yang <sh...@citrix.com>
Authored: Tue Jan 21 11:43:50 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Tue Jan 21 18:59:30 2014 -0800
----------------------------------------------------------------------
.../vmware/resource/VmwareResource.java | 60 ++-----
systemvm/patches/debian/config/root/userdata.py | 92 -----------
systemvm/patches/debian/config/root/userdata.sh | 165 -------------------
3 files changed, 12 insertions(+), 305 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1767ddac/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index d906a8c..b8887af 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -296,6 +296,7 @@ import org.apache.cloudstack.storage.command.DeleteCommand;
import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
import org.apache.cloudstack.storage.to.TemplateObjectTO;
import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.apache.log4j.NDC;
@@ -2346,55 +2347,29 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
s_logger.info("Executing resource VmDataCommand: " + _gson.toJson(cmd));
}
- String routerPrivateIpAddress = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
String controlIp = getRouterSshControlIp(cmd);
+ Map<String, List<String[]>> data = new HashMap<String, List<String[]>>();
+ data.put(cmd.getVmIpAddress(), cmd.getVmData());
- String vmIpAddress = cmd.getVmIpAddress();
- List<String[]> vmData = cmd.getVmData();
- String[] vmDataArgs = new String[vmData.size() * 2 + 4];
- vmDataArgs[0] = "routerIP";
- vmDataArgs[1] = routerPrivateIpAddress;
- vmDataArgs[2] = "vmIP";
- vmDataArgs[3] = vmIpAddress;
- int i = 4;
- for (String[] vmDataEntry : vmData) {
- String folder = vmDataEntry[0];
- String file = vmDataEntry[1];
- String contents = (vmDataEntry[2] != null) ? vmDataEntry[2] : "none";
+ String json = new Gson().toJson(data);
+ s_logger.debug("VM data JSON IS:" + json);
- vmDataArgs[i] = folder + "," + file;
- vmDataArgs[i + 1] = contents;
- i += 2;
- }
+ json = Base64.encodeBase64String(json.getBytes());
- String content = encodeDataArgs(vmDataArgs);
- String tmpFileName = UUID.randomUUID().toString();
+ String args = "-d " + json;
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Run vm_data command on domain router " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP) + ", data: " + content);
- }
+ VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
try {
- VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
- SshHelper.scpTo(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/tmp", content.getBytes(), tmpFileName, null);
-
- try {
- Pair<Boolean, String> result =
- SshHelper.sshExecute(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/root/userdata.py " + tmpFileName);
-
- if (!result.first()) {
- s_logger.error("vm_data command on domain router " + controlIp + " failed. messge: " + result.second());
- return new Answer(cmd, false, "VmDataCommand failed due to " + result.second());
- }
- } finally {
-
- SshHelper.sshExecute(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "rm /tmp/" + tmpFileName);
+ Pair<Boolean, String> result = SshHelper.sshExecute(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/opt/cloud/bin/vmdata.py " + args);
+ if (!result.first()) {
+ s_logger.error("vm_data command on domain router " + controlIp + " failed. messge: " + result.second());
+ return new Answer(cmd, false, "VmDataCommand failed due to " + result.second());
}
if (s_logger.isInfoEnabled()) {
s_logger.info("vm_data command on domain router " + controlIp + " completed");
}
-
} catch (Throwable e) {
String msg = "VmDataCommand failed due to " + VmwareHelper.getExceptionMessage(e);
s_logger.error(msg, e);
@@ -2403,17 +2378,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
return new Answer(cmd);
}
- private String encodeDataArgs(String[] dataArgs) {
- StringBuilder sb = new StringBuilder();
-
- for (String arg : dataArgs) {
- sb.append(arg);
- sb.append("\n");
- }
-
- return sb.toString();
- }
-
protected CheckSshAnswer execute(CheckSshCommand cmd) {
String vmName = cmd.getName();
String privateIp = cmd.getIp();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1767ddac/systemvm/patches/debian/config/root/userdata.py
----------------------------------------------------------------------
diff --git a/systemvm/patches/debian/config/root/userdata.py b/systemvm/patches/debian/config/root/userdata.py
deleted file mode 100644
index cc130a5..0000000
--- a/systemvm/patches/debian/config/root/userdata.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/python
-# 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.
-
-
-
-import sys
-import base64
-import string
-import os
-import tempfile
-from subprocess import call
-
-def vm_data(args):
-
- router_ip = args.pop('routerIP')
- vm_ip = args.pop('vmIP')
-
- for pair in args:
- pairList = pair.split(',')
- vmDataFolder = pairList[0]
- vmDataFile = pairList[1]
- vmDataValue = args[pair]
- cmd = ["/bin/bash", "/root/userdata.sh", "-v", vm_ip, "-F", vmDataFolder, "-f", vmDataFile]
-
- fd = None
- tmp_path = None
-
- try:
- fd,tmp_path = tempfile.mkstemp()
- tmpfile = open(tmp_path, 'w')
-
- if (vmDataFolder == "userdata" and vmDataValue != "none"):
- vmDataValue = base64.urlsafe_b64decode(vmDataValue)
-
- if vmDataValue != "none":
- tmpfile.write(vmDataValue)
-
- tmpfile.close()
- cmd.append("-d")
- cmd.append(tmp_path)
- except:
- if fd !=None:
- os.close(fd)
- os.remove(tmp_path)
- return ''
-
- try:
- call(cmd)
- txt = 'success'
- except:
- txt = ''
-
- if (fd != None):
- os.close(fd)
- os.remove(tmp_path)
-
- return txt
-
-def parseFileData(fileName):
- args = {}
- fd = open(fileName)
-
- line = fd.readline()
- while (line != ""):
- key=string.strip(line[:], '\n')
- if (key == ""):
- break
-
- line=fd.readline()
- val=string.strip(line[:], '\n')
- args[key]=val
- line=fd.readline()
- return args
-
-if __name__ == "__main__":
- vm_data(parseFileData("/tmp/" + sys.argv[1]))
-
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1767ddac/systemvm/patches/debian/config/root/userdata.sh
----------------------------------------------------------------------
diff --git a/systemvm/patches/debian/config/root/userdata.sh b/systemvm/patches/debian/config/root/userdata.sh
deleted file mode 100644
index 83ecdfd..0000000
--- a/systemvm/patches/debian/config/root/userdata.sh
+++ /dev/null
@@ -1,165 +0,0 @@
-#!/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.
-
-
-
-source /root/func.sh
-
-lock="biglock"
-#default timeout value is 30 mins as userdata command is not synchronized on agent side any more,
-#and multiple commands can be sent to the same VR at a time
-locked=$(getLockFile $lock 1800)
-if [ "$locked" != "1" ]
-then
- exit 1
-fi
-
-usage() {
- printf "Usage: %s: -v <vm ip> -F <vm data folder> -f <vm data file> -d <data to put in file> \n" $(basename $0) >&2
- unlock_exit 2 $lock $locked
-}
-
-set -x
-
-PORT=3922
-
-create_htaccess() {
- local vmIp=$1
- local folder=$2
- local file=$3
-
- local result=0
-
- entry="RewriteRule ^$file$ ../$folder/%{REMOTE_ADDR}/$file [L,NC,QSA]"
- htaccessFolder="/var/www/html/latest"
- htaccessFile=$htaccessFolder/.htaccess
- mkdir -p $htaccessFolder
- touch $htaccessFile
-
-# Fixed the issue with checking if record exists, rewrote the else/if logic, reference issue CLOUDSTACK-2053
-
- if ! grep -Fq "$entry" $htaccessFile
- then
- echo -e $entry >> $htaccessFile;
- result=$?
- fi
-
- entry="Options -Indexes\\nOrder Deny,Allow\\nDeny from all\\nAllow from $vmIp"
- testentry="Allow from $vmIp"
- htaccessFolder="/var/www/html/$folder/$vmIp"
- htaccessFile=$htaccessFolder/.htaccess
- if ! grep -Fq "$testentry" $htaccessFile
- then
- mkdir -p $htaccessFolder
- echo -e $entry > $htaccessFile
- result=$?
- fi
-
-
-# Please reference issue CLOUDSTACK-2053, added to fix boto/cloud-init integration
-
- htaccessFileNoIP="/var/www/html/latest/.htaccess"
- metadataentry1='RewriteRule ^meta-data/$ ../metadata/%{REMOTE_ADDR}/meta-data [L,NC,QSA]'
- metadataentry2='RewriteRule ^meta-data/(.*)$ ../metadata/%{REMOTE_ADDR}/$1 [L,NC,QSA]'
- if ! grep -Fq "$metadataentry1" $htaccessFileNoIP
- then
- echo -e "$metadataentry1" >> $htaccessFileNoIP;
- fi
-
- if ! grep -Fq "$metadataentry2" $htaccessFileNoIP
- then
- echo -e "$metadataentry2" >> $htaccessFileNoIP;
- fi
-
- return $result
-}
-
-copy_vm_data_file() {
- local vmIp=$1
- local folder=$2
- local file=$3
- local dataFile=$4
-
- dest=/var/www/html/$folder/$vmIp/$file
- metamanifest=/var/www/html/$folder/$vmIp/meta-data
- chmod +r $dataFile
- cp $dataFile $dest
- chmod 644 $dest
- touch $metamanifest
- chmod 644 $metamanifest
- if [ "$folder" == "metadata" ] || [ "$folder" == "meta-data" ]
- then
- sed -i '/$file/d' $metamanifest
- echo $file >> $metamanifest
- fi
- return $?
-}
-
-delete_vm_data_file() {
- local domrIp=$1
- local vmIp=$2
- local folder=$3
- local file=$4
-
- vmDataFilePath="/var/www/html/$folder/$vmIp/$file"
- if [ -f $vmDataFilePath ]; then
- rm -rf $vmDataFilePath
- fi
- return $?
-}
-
-vmIp=
-folder=
-file=
-dataFile=
-
-while getopts 'v:F:f:d:' OPTION
-do
- case $OPTION in
- v) vmIp="$OPTARG"
- ;;
- F) folder="$OPTARG"
- ;;
- f) file="$OPTARG"
- ;;
- d) dataFile="$OPTARG"
- ;;
- ?) usage
- unlock_exit 1 $lock $locked
- ;;
- esac
-done
-
-[ "$vmIp" == "" ] || [ "$folder" == "" ] || [ "$file" == "" ] && usage
-[ "$folder" != "userdata" ] && [ "$folder" != "metadata" ] && usage
-
-if [ "$dataFile" != "" ]
-then
- create_htaccess $vmIp $folder $file
-
- if [ $? -gt 0 ]
- then
- unlock_exit 1 $lock $locked
- fi
-
- copy_vm_data_file $vmIp $folder $file $dataFile
-else
- delete_vm_data_file $vmIp $folder $file
-fi
-
-unlock_exit $? $lock $locked