From 9d64e0a6808e7d96401ecca3c4e63315332b5d79 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Fri, 18 Dec 2015 14:48:22 +0800 Subject: [PATCH 01/12] RDMA Updaet in WALA. RDMA Updaet in WALA. --- config/waagent.conf | 3 + waagent | 382 +++++++++++++++++++++++++++++++++----------- 2 files changed, 288 insertions(+), 97 deletions(-) diff --git a/config/waagent.conf b/config/waagent.conf index 081579b..d511ce9 100644 --- a/config/waagent.conf +++ b/config/waagent.conf @@ -84,3 +84,6 @@ OS.OpensslPath=None #HttpProxy.Host=None #HttpProxy.Port=None +# If set, agent will try to update or check the rdma driver +OS.UpdateRdmaDriver=y +OS.CheckRdmaDriver=y diff --git a/waagent b/waagent index aa35a0b..60c0d07 100644 --- a/waagent +++ b/waagent @@ -79,7 +79,7 @@ if not hasattr(subprocess,'check_output'): subprocess.check_output=check_output subprocess.CalledProcessError=CalledProcessError - + GuestAgentName = "WALinuxAgent" GuestAgentLongName = "Azure Linux Agent" GuestAgentVersion = "WALinuxAgent-2.0.16" @@ -191,7 +191,7 @@ class AbstractDistro(object): self.shadow_file_mode=0600 self.shadow_file_path="/etc/shadow" self.dhcp_enabled = False - + def isSelinuxSystem(self): """ Checks and sets self.selinux = True if SELinux is available on system. @@ -202,7 +202,7 @@ class AbstractDistro(object): else: self.selinux = True return self.selinux - + def isSelinuxRunning(self): """ Calls shell command 'getenforce' and returns True if 'Enforcing'. @@ -211,7 +211,7 @@ class AbstractDistro(object): return RunGetOutput("getenforce")[1].startswith("Enforcing") else: return False - + def setSelinuxEnforce(self,state): """ Calls shell command 'setenforce' with 'state' and returns resulting exit code. @@ -228,14 +228,14 @@ class AbstractDistro(object): """ if self.isSelinuxSystem(): return Run('chcon ' + cn + ' ' + path) - + def setHostname(self,name): """ Shell call to hostname. Returns resulting exit code. """ return Run('hostname ' + name) - + def publishHostname(self,name): """ Set the contents of the hostname file to 'name'. @@ -250,7 +250,7 @@ class AbstractDistro(object): except: return 1 return r - + def installAgentServiceScriptFiles(self): """ Create the waagent support files for service installation. @@ -266,7 +266,7 @@ class AbstractDistro(object): Abstract Virtual Function. Over-ridden in concrete Distro classes. """ pass - + def uninstallAgentService(self): """ Call service subsystem to remove waagent script. @@ -280,19 +280,19 @@ class AbstractDistro(object): """ self.stopAgentService() self.uninstallAgentService() - + def startAgentService(self): """ Service call to start the Agent service """ return Run(self.service_cmd + ' ' + self.agent_service_name + ' start') - + def stopAgentService(self): """ Service call to stop the Agent service """ return Run(self.service_cmd + ' ' + self.agent_service_name + ' stop',False) - + def restartSshService(self): """ Service call to re(start) the SSH service @@ -315,7 +315,7 @@ class AbstractDistro(object): Error("Failed: " + fprint + ".crt -> " + path) error = 1 return error - + def checkPackageInstalled(self,p): """ Query package database for prescence of an installed package. @@ -342,7 +342,7 @@ class AbstractDistro(object): self.setSelinuxContext(filepath,'system_u:object_r:shadow_t:s0') Log("Root password deleted.") return 0 - + def changePass(self,user,password): Log("Change user password") crypt_id = Config.get("Provisioning.PasswordCryptId") @@ -643,7 +643,7 @@ class AbstractDistro(object): def getConfigurationPath(self): return "/etc/waagent.conf" - + def getProcessorCores(self): return int(RunGetOutput("grep 'processor.*:' /proc/cpuinfo |wc -l")[1]) @@ -682,6 +682,36 @@ class AbstractDistro(object): Run("/sbin/route add -net " + net + " netmask " + mask + " gw " + gateway, chk_err=False) + def getNdDriverVersion(self): + """ + if error happens, raise a RdmaException + """ + try: + with open("/var/lib/hyperv/.kvp_pool_0", "r") as f: + lines = f.read() + r = re.search("NdDriverVersion\0+(\d\d\d\.\d)", lines) + if r is not None: + NdDriverVersion = r.groups()[0] + return NdDriverVersion #e.g. NdDriverVersion = 142.0 + else : + Log("Error: NdDriverVersion not found.") + return None + except Exception as e: + errMsg = 'Failed to enable the extension with error: %s, stack trace: %s' % (str(e), traceback.format_exc()) + Log("Can't update status: " + errMsg) + raise RdmaError(RdmaConfig.nd_driver_detect_error) + + def checkInstallHyperV(self): + return None + + def getRdmaPackageVersion(self): + return None + + def rdmaUpdate(self): + pass + + def checkRDMA(self): + pass ############################################################ # GentooDistro @@ -703,6 +733,7 @@ depend() } """ + class gentooDistro(AbstractDistro): """ Gentoo distro concrete class @@ -880,21 +911,32 @@ class SuSEDistro(AbstractDistro): """ def __init__(self): super(SuSEDistro,self).__init__() - self.service_cmd='/sbin/service' - self.ssh_service_name='sshd' - self.kernel_boot_options_file='/boot/grub/menu.lst' - self.hostname_file_path='/etc/HOSTNAME' - self.requiredDeps += [ "/sbin/insserv" ] - self.init_file=suse_init_file - self.dhcp_client_name='dhcpcd' - if ((DistInfo(fullname=1)[0] == 'SUSE Linux Enterprise Server' and DistInfo()[1] >= '12') or \ - (DistInfo(fullname=1)[0] == 'openSUSE' and DistInfo()[1] >= '13.2')): - self.dhcp_client_name='wickedd-dhcp4' + self.dhcp_client_name = 'dhcpcd' + self.dhcp_enabled = True self.grubKernelBootOptionsFile = '/boot/grub/menu.lst' self.grubKernelBootOptionsLine = 'kernel' - self.getpidcmd='pidof ' - self.dhcp_enabled=True + self.getpidcmd = 'pidof ' + self.hostname_file_path = '/etc/HOSTNAME' + self.init_file = suse_init_file + self.kernel_boot_options_file = '/boot/grub/menu.lst' + self.modprobe_path = '/usr/bin/modprobe' + self.requiredDeps += [ "/sbin/insserv" ] + self.reboot_path = '/sbin/reboot' + self.service_cmd = '/sbin/service' + self.ssh_service_name ='sshd' + dist_info = DistInfo() + dist_info_fullname = DistInfo(fullname=1) + if(dist_info[1] == "11"): + self.ps_path = '/bin/ps' + else: + self.ps_path = '/usr/bin/ps' + + if ((dist_info_fullname[0] == 'SUSE Linux Enterprise Server' and dist_info[1] >= '12') or \ + (dist_info_fullname[0] == 'openSUSE' and dist_info[1] >= '13.2')): + self.dhcp_client_name = 'wickedd-dhcp4' + self.zypper_path = '/usr/bin/zypper' + def checkPackageInstalled(self,p): if Run("rpm -q " + p,chk_err=False): return 0 @@ -906,7 +948,6 @@ class SuSEDistro(AbstractDistro): return 1 else: return 0 - def installAgentServiceScriptFiles(self): try: @@ -914,7 +955,7 @@ class SuSEDistro(AbstractDistro): os.chmod(self.init_script_file, 0744) except: pass - + def registerAgentService(self): self.installAgentServiceScriptFiles() return Run('insserv ' + self.agent_service_name) @@ -931,7 +972,117 @@ class SuSEDistro(AbstractDistro): def stopDHCP(self): Run("service " + self.dhcp_client_name + " stop", chk_err=False) - + + def getRdmaPackageVersion(self): + """ + """ + error, output = RunGetOutput(self.zypper_path + " info " + RdmaConfig.rmda_package_name) + if(error == RdmaConfig.process_success): + r = re.search("Version: (\S+)", output) + if r is not None: + package_version = r.groups()[0]# e.g. package_version is "20150707_k3.12.28_4-3.1.140.0" + return package_version + else: + return None + else: + return None + + def checkInstallHyperV(self): + error, output = RunGetOutput(self.ps_path + " -ef") + if(error != RdmaConfig.process_success): + return RdmaConfig.common_failed + else: + r = re.search("hv_kvp_daemon", output) + if r is None : + Log("KVP deamon is not running, install it") + error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") + Log("install hyper-v return code: " + str(error) + " output:" + str(output)) + if(error != RdmaConfig.process_success): + return RdmaConfig.common_failed + self.rebootMachine() + return RdmaConfig.process_success + else : + Log("KVP deamon is running") + return RdmaConfig.process_success + + def rdmaUpdate(self): + check_install_result = self.checkInstallHyperV() + if(check_install_result == RdmaConfig.process_success): + time.sleep(40) + check_result = self.checkRDMA() + Log("RDMA version check result is " + str(check_result)) + if(check_result == RdmaConfig.UpToDate): + return + elif(check_result == RdmaConfig.OutOfDate): + nd_driver_version = self.getNdDriverVersion() + update_rdma_driver_result = self.rdmaUpdatePackage(nd_driver_version) + elif(check_result == RdmaConfig.DriverVersionNotFound): + raise RdmaException(RdmaConfig.driver_version_not_found) + elif(check_result == RdmaConfig.Unknown): + raise RdmaException(RdmaConfig.unknown_error) + else: + raise RdmaException(RdmaConfig.install_hv_utils_failed) + + def rdmaUpdatePackage(self, host_version): + error, output = RunGetOutput(self.zypper_path + " lr -u") + rdma_pack_repository_name = "msft-rdma-pack" + rdma_pack_result = re.search(rdma_pack_repository_name, output) + if rdma_pack_result is None : + Log("rdma_pack_result is None") + error, output = RunGetOutput(self.zypper_path + " ar https://drivers.suse.com/microsoft/Microsoft-LIS-RDMA/sle-12/updates " + rdma_pack_repository_name) + #wait for the cache build. + time.sleep(20) + Log("error result is " + str(error) + " output is : " + str(output)) + else: + Log("output is: " + str(output)) + Log("msft-rdma-pack found") + returnCode, message = RunGetOutput(self.zypper_path + " --no-gpg-checks refresh") + Log("refresh repro return code is " + str(returnCode) + " output is: " + str(message)) + #install the wrapper package, that will put the driver RPM packages under /opt/microsoft/rdma + returnCode, message = RunGetOutput(self.zypper_path + " -n remove " + RdmaConfig.wrapper_package_name) + Log("remove wrapper package return code is " + str(returnCode) + " output is: " + str(message)) + returnCode, message = RunGetOutput(self.zypper_path + " --non-interactive install --force " + RdmaConfig.wrapper_package_name) + Log("install wrapper package return code is " + str(returnCode) + " output is: " + str(message)) + r = os.listdir("/opt/microsoft/rdma") + if r is not None : + for filename in r : + if re.match(RdmaConfig.rmda_package_name + "-\d{8}\.(%s).+" % host_version, filename) : + error, output = RunGetOutput(self.zypper_path + " --non-interactive remove " + RdmaConfig.rmda_package_name) + Log("remove rdma package result is " + str(error) + " output is: " + str(output)) + Log("Installing RPM /opt/microsoft/rdma/" + filename) + error, output = RunGetOutput(self.zypper_path + " --non-interactive install --force /opt/microsoft/rdma/%s" % filename) + Log("Install rdma package result is " + str(error) + " output is: " + str(output)) + if(error == RdmaConfig.process_success): + self.rebootMachine() + else: + raise RdmaError(RdmaConfig.package_install_failed) + else: + Log("RDMA drivers not found in /opt/microsoft/rdma") + raise RdmaError(RdmaConfig.package_not_found) + + def checkRDMA(self): + nd_driver_version = self.getNdDriverVersion() + if(nd_driver_version is None or nd_driver_version == ""): + return RdmaConfig.DriverVersionNotFound + package_version = self.getRdmaPackageVersion() + if(package_version is None or package_version == ""): + return RdmaConfig.OutOfDate + else: + # package_version would be like this :20150707_k3.12.28_4-3.1 20150707.140.0_k3.12.28_4-1.1 + # nd_driver_version 140.0 + Log("nd_driver_version is " + str(nd_driver_version) + " package_version is " + str(package_version)) + if(nd_driver_version is not None): + r = re.match("^[0-9]+[.](%s).+" % nd_driver_version, package_version)# NdDriverVersion should be at the end of package version + if not r : #host ND version is the same as the package version, do an update + return RdmaConfig.OutOfDate + else: + return RdmaConfig.UpToDate + return RdmaConfig.Unknown + + def rebootMachine(self): + Log("rebooting the machine") + RunGetOutput(self.reboot_path) + ############################################################ # redhatDistro ############################################################ @@ -992,7 +1143,6 @@ case "$1" in esac exit $RETVAL """ - class redhatDistro(AbstractDistro): """ Redhat Distro concrete class @@ -1031,14 +1181,14 @@ class redhatDistro(AbstractDistro): def registerAgentService(self): self.installAgentServiceScriptFiles() return Run('chkconfig --add waagent') - + def uninstallAgentService(self): return Run('chkconfig --del ' + self.agent_service_name) def unregisterAgentService(self): self.stopAgentService() return self.uninstallAgentService() - + def checkPackageInstalled(self,p): if Run("yum list installed " + p,chk_err=False): return 0 @@ -1082,6 +1232,12 @@ class centosDistro(redhatDistro): def __init__(self): super(centosDistro,self).__init__() + def rdmaUpdate(self): + pass + + def checkRDMA(self): + pass + ############################################################ # oracleDistro ############################################################ @@ -1094,8 +1250,6 @@ class oracleDistro(redhatDistro): def __init__(self): super(oracleDistro, self).__init__() - - ############################################################ # asianuxDistro ############################################################ @@ -1108,7 +1262,6 @@ class asianuxDistro(redhatDistro): def __init__(self): super(asianuxDistro,self).__init__() - ############################################################ # CoreOSDistro ############################################################ @@ -1316,7 +1469,6 @@ esac exit 0 """ - class debianDistro(AbstractDistro): """ debian Distro concrete class @@ -1400,7 +1552,7 @@ class debianDistro(AbstractDistro): return 1 else : return 0 - + ############################################################ # KaliDistro - WIP # Functioning on Kali 1.1.0a so far @@ -1443,7 +1595,6 @@ end script exec /usr/sbin/waagent -daemon """ - class UbuntuDistro(debianDistro): """ Ubuntu Distro concrete class @@ -1459,7 +1610,7 @@ class UbuntuDistro(debianDistro): def registerAgentService(self): return self.installAgentServiceScriptFiles() - + def uninstallAgentService(self): """ If we are packaged - the service name is walinuxagent, do nothing. @@ -1523,7 +1674,6 @@ class UbuntuDistro(debianDistro): Error("Can't find host key: {0}".format(path)) return False - ############################################################ # LinuxMintDistro ############################################################ @@ -2261,7 +2411,7 @@ def RunGetOutput(cmd, chk_err=True, log_cmd=True): """ if log_cmd: LogIfVerbose(cmd) - try: + try: output=subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) except subprocess.CalledProcessError,e : if chk_err and log_cmd: @@ -2511,13 +2661,13 @@ class Logger(object): self.file_path=filepath self.con_path=conpath self.verbose=verbose - + def ThrottleLog(self,counter): """ Log everything up to 10, every 10 up to 100, then every 100. """ return (counter < 10) or ((counter < 100) and ((counter % 10) == 0)) or ((counter % 100) == 0) - + def LogToFile(self,message): """ Write 'message' to logfile. @@ -2530,7 +2680,7 @@ class Logger(object): except IOError, e: print e pass - + def LogToCon(self,message): """ Write 'message' to /dev/console. @@ -2544,14 +2694,14 @@ class Logger(object): C.write(message.encode('ascii','ignore') + "\n") except IOError, e: pass - + def Log(self,message): """ Standard Log function. Logs to self.file_path, and con_path """ self.LogWithPrefix("", message) - + def LogWithPrefix(self,prefix, message): """ Prefix each line of 'message' with current time+'prefix'. @@ -2563,19 +2713,19 @@ class Logger(object): line = t + line self.LogToFile(line) self.LogToCon(line) - + def NoLog(self,message): """ Don't Log. """ pass - + def LogIfVerbose(self,message): """ Only log 'message' if global Verbose is True. """ self.LogWithPrefixIfVerbose('',message) - + def LogWithPrefixIfVerbose(self,prefix, message): """ Only log 'message' if global Verbose is True. @@ -2589,26 +2739,26 @@ class Logger(object): line = t + line self.LogToFile(line) self.LogToCon(line) - + def Warn(self,message): """ Prepend the text "WARNING:" to the prefix for each line in 'message'. """ self.LogWithPrefix("WARNING:", message) - + def Error(self,message): """ Call ErrorWithPrefix(message). """ ErrorWithPrefix("", message) - + def ErrorWithPrefix(self,prefix, message): """ Prepend the text "ERROR:" to the prefix for each line in 'message'. Errors written to logfile, and /dev/console """ self.LogWithPrefix("ERROR:", message) - + def LoggerInit(log_file_path,log_con_path,verbose=False): """ Create log object and export its methods to global scope. @@ -2755,7 +2905,7 @@ def DoInstallRHUIRPM(): return Log("install RHUI RPM completed") - + class Util(object): """ Http communication class. @@ -3092,7 +3242,7 @@ class TCPHandler(SocketServer.BaseRequestHandler): log("Received LB probe # " + strCounter) self.request.recv(1024) self.request.send("HTTP/1.1 200 OK\r\nContent-Length: 2\r\nContent-Type: text/html\r\nDate: " + self.GetHttpDateTimeNow() + "\r\n\r\nOK") - + class LoadBalancerProbeServer(object): """ Threaded object to receive and send LB probe messages. @@ -3124,9 +3274,6 @@ class ConfigurationProvider(object): """ def __init__(self, walaConfigFile): self.values = dict() - if 'MyDistro' not in globals(): - global MyDistro - MyDistro = GetMyDistro() if walaConfigFile is None: walaConfigFile = MyDistro.getConfigurationPath() if os.path.isfile(walaConfigFile) == False: @@ -3148,6 +3295,20 @@ class ConfigurationProvider(object): def get(self, key): return self.values.get(key) + def yes(self,key): + configValue = self.get(key) + if(configValue is not None and configValue.lower().startswith("y")): + return True + else: + return False + + def no(self,key): + configValue = self.get(key) + if(configValue is not None and configValue.lower().startswith("n")): + return True + else: + return False + class EnvMonitor(object): """ Montor changes to dhcp and hostname. @@ -3424,8 +3585,34 @@ class SharedConfig(object): rdma_configured = False +class RdmaConfig(object): + """ + configurations + """ + wrapper_package_name = 'msft-rdma-drivers' + rmda_package_name = 'msft-lis-rdma-kmp-default' + """ + error code definitions + """ + process_success = 0 + common_failed = 1 + install_hv_utils_failed = 2 + nd_driver_detect_error = 3 + driver_version_not_found = 4 + unknown_error = 5 + package_not_found = 6 + package_install_failed = 7 + """ + check_rdma_result + """ + UpToDate = 0 + OutOfDate = 1 + DriverVersionNotFound = 3 + Unknown = -1 + class RdmaError(Exception): - pass + def __init__(error_code = RdmaConfig.process_success): + self.error_code = error_code class RdmaHandler(object): """ @@ -4083,7 +4270,6 @@ class ExtensionsConfig(object): continue return str(seq_no) - def GenerateAggStatus(self, name, version, reportHeartbeat = False): """ Generate the status which Azure can understand by the status and heartbeat reported by extension @@ -4142,7 +4328,6 @@ class ExtensionsConfig(object): agg_status_string = json.dumps(agg_status_obj) LogIfVerbose("Handler Aggregated Status:" + agg_status_string) return agg_status_string - def SetHandlerState(self, handler, state=''): zip_dir=LibDir+"/" + handler @@ -4166,7 +4351,6 @@ class ExtensionsConfig(object): else: return 'NotInstalled' - class HostingEnvironmentConfig(object): """ Parse Hosting enviromnet config and store in @@ -4453,7 +4637,7 @@ class GoalState(Util): LogIfVerbose("Process goalstate") self.HostingEnvironmentConfig.Process() self.SharedConfig.Process() - + class OvfEnv(object): """ Read, and process provisioning info from provisioning file OvfEnv.xml @@ -4724,13 +4908,10 @@ class OvfEnv(object): MyDistro.restartSshService() return error - -class WALAEvent(object): +class WALAEvent(object): def __init__(self): - self.providerId="" self.eventId=1 - self.OpcodeName="" self.KeywordName="" self.TaskName="" @@ -4759,7 +4940,7 @@ class WALAEvent(object): for attName in self.__dict__: if attName in ["eventId","filedCount","providerId"]: continue - + attValue = self.__dict__[attName] if type(attValue) is int: strEventsData+=strRecordFormat.format(attName,attValue,strMtUInt64) @@ -4778,7 +4959,7 @@ class WALAEvent(object): if type(attValue) is float: strEventsData+=strRecordFormat.format(attName,attValue,strMtFloat) continue - + Log("Warning: property "+attName+":"+str(type(attValue))+":type"+str(type(attValue))+"Can't convert to events data:"+":type not supported") return u"{0}{1}{2}".format(strProviderid,strEventid,strEventsData) @@ -4790,13 +4971,12 @@ class WALAEvent(object): os.chmod(eventfolder,0700) if len(os.listdir(eventfolder)) > 1000: raise Exception("WriteToFolder:Too many file under "+eventfolder+" exit") - + filename = os.path.join(eventfolder,str(int(time.time()*1000000))) with open(filename+".tmp",'wb+') as hfile: hfile.write(self.ToXml().encode("utf-8")) os.rename(filename+".tmp",filename+".tld") - class WALAEventOperation: HeartBeat="HeartBeat" Provision = "Provision" @@ -4806,7 +4986,7 @@ class WALAEventOperation: Enable = "Enable" Download = "Download" Upgrade = "Upgrade" - Update = "Update" + Update = "Update" def AddExtensionEvent(name,op,isSuccess,duration=0,version="1.0",message="",type="",isInternal=False): event = ExtensionEvent() @@ -4822,8 +5002,7 @@ def AddExtensionEvent(name,op,isSuccess,duration=0,version="1.0",message="",type event.Save() except: Error("Error "+traceback.format_exc()) - - + class ExtensionEvent(WALAEvent): def __init__(self): @@ -4838,8 +5017,7 @@ class ExtensionEvent(WALAEvent): self.ExtensionType="" self.Message="" self.Duration=0 - - + class WALAEventMonitor(WALAEvent): def __init__(self,postMethod): WALAEvent.__init__(self) @@ -4852,7 +5030,7 @@ class WALAEventMonitor(WALAEvent): eventThread = threading.Thread(target = self.EventsLoop) eventThread.setDaemon(True) eventThread.start() - + def EventsLoop(self): LastReportHeartBeatTime = datetime.datetime.min try: @@ -4865,7 +5043,7 @@ class WALAEventMonitor(WALAEvent): time.sleep(60) except: Error("Exception in events loop:"+traceback.format_exc()) - + def SendEvent(self,providerid,events): dataFormat = u'{1}'\ '' @@ -4927,7 +5105,6 @@ class WALAEventMonitor(WALAEvent): self.SendEvent(key,events[key]) if eventSendNumber%3 == 0: time.sleep(15) - def AddSystemInfo(self,eventData): if not self.issysteminfoinitilized: @@ -4955,8 +5132,7 @@ class WALAEventMonitor(WALAEvent): if self.sysInfo.get(name): node.setAttribute("Value",xml.sax.saxutils.escape(str(self.sysInfo[name]))) - return eventObject.toxml() - + return eventObject.toxml() class Agent(Util): """ @@ -5473,7 +5649,7 @@ class Agent(Util): return 1 Log("Loaded " + krn_pth + " driver for ATAPI CD-ROM") - + # we have succeeded loading the ata_piix mod if it can be done. def SearchForVMMStartup(self): @@ -5523,7 +5699,7 @@ class Agent(Util): Log("VMM Init script not found. Provisioning for Azure") return - + def Provision(self): """ Responible for: @@ -5660,6 +5836,7 @@ class Agent(Util): if self.Endpoint == None: Log("Azure environment not detected.") while True: + # TODO: find a way to notify the customer, sleep here is not proper. time.sleep(60) Log("Discovered Azure endpoint: " + self.Endpoint) @@ -5673,25 +5850,39 @@ class Agent(Util): MyDistro.initScsiDiskTimeout() global provisioned global provisionError - + global Openssl Openssl = Config.get("OS.OpensslPath") if Openssl == None: Openssl = "openssl" self.TransportCert = self.GenerateTransportCert() - + eventMonitor = None incarnation = None # goalStateIncarnationFromHealthReport currentPort = None # loadBalancerProbePort goalState = None # self.GoalState, instance of GoalState provisioned = os.path.exists(LibDir + "/provisioned") program = Config.get("Role.StateConsumer") - provisionError = None + provisionError = None lbProbeResponder = True - setting = Config.get("LBProbeResponder") - if setting != None and setting.lower().startswith("n"): + + lbProbeResponderNo = Config.no("LBProbeResponder") + if lbProbeResponderNo: lbProbeResponder = False + + updateRdmaDriverConfigured = Config.yes("OS.UpdateRdmaDriver") + if(updateRdmaDriverConfigured): + MyDistro.rdmaUpdate() + else: + Log("OS.UpdateRdmaDriver configured to "+str(updateRdmaDriverConfigured)+" so skip the rdma update.") + checkRdmaDriverConfigured = Config.yes("OS.CheckRdmaDriver") + if(checkRdmaDriverConfigured): + checkRdmaResult = MyDistro.checkRDMA() + Log("Rdma check result is " + str(checkRdmaResult)) + else: + Log("OS.CheckRdmaDriver configured to "+str(checkRdmaDriverConfigured)+" so skip the rdma check.") + while True: if (goalState == None) or (incarnation == None) or (goalState.Incarnation != incarnation): try: @@ -5782,18 +5973,17 @@ class Agent(Util): # report the status/heartbeat results of extension processing if goalState.ExtensionsConfig != None : goalState.ExtensionsConfig.ReportHandlerStatus() - + global LinuxDistro if LinuxDistro == "redhat": DoInstallRHUIRPM() - + if not eventMonitor: eventMonitor = WALAEventMonitor(self.HttpPostWithHeaders) eventMonitor.StartEventsLoop() time.sleep(25 - sleepToReduceAccessDenied) - WaagentLogrotate = """\ /var/log/waagent.log { monthly @@ -5913,7 +6103,7 @@ def ApplyVNUMAWorkaround(): Log("Your kernel version " + platform.release() + " has a NUMA-related bug: NUMA has been disabled.") else : "Error adding 'numa=off'. NUMA has not been disabled." - + def RevertVNUMAWorkaround(): """ Remove 'numa=off' from kernel boot options. @@ -6101,8 +6291,6 @@ def Usage(): print("usage: " + sys.argv[0] + " [-verbose] [-force] [-help|-install|-uninstall|-deprovision[+user]|-version|-serialconsole|-daemon]") return 0 - - def main(): """ Instantiate MyDistro, exit if distro class is not defined. @@ -6120,9 +6308,9 @@ def main(): LoggerInit('/var/log/waagent.log','/dev/console') global LinuxDistro LinuxDistro=DistInfo()[0] - + global MyDistro - MyDistro=GetMyDistro() + MyDistro = GetMyDistro() if MyDistro == None : sys.exit(1) args = [] @@ -6190,8 +6378,8 @@ def main(): WaAgent.Run() except Exception, e: Error(traceback.format_exc()) + Error("Exception: " + str(e)) sys.exit(1) - if __name__ == '__main__' : main() From 385631aefaf63a7a22e5427e5ee6bfe17f031e66 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Mon, 21 Dec 2015 14:08:27 +0800 Subject: [PATCH 02/12] fix the RdmaException not found issue. --- waagent | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/waagent b/waagent index 60c0d07..bfd3c72 100644 --- a/waagent +++ b/waagent @@ -684,7 +684,7 @@ class AbstractDistro(object): def getNdDriverVersion(self): """ - if error happens, raise a RdmaException + if error happens, raise a RdmaError """ try: with open("/var/lib/hyperv/.kvp_pool_0", "r") as f: @@ -1017,11 +1017,11 @@ class SuSEDistro(AbstractDistro): nd_driver_version = self.getNdDriverVersion() update_rdma_driver_result = self.rdmaUpdatePackage(nd_driver_version) elif(check_result == RdmaConfig.DriverVersionNotFound): - raise RdmaException(RdmaConfig.driver_version_not_found) + raise RdmaError(RdmaConfig.driver_version_not_found) elif(check_result == RdmaConfig.Unknown): - raise RdmaException(RdmaConfig.unknown_error) + raise RdmaError(RdmaConfig.unknown_error) else: - raise RdmaException(RdmaConfig.install_hv_utils_failed) + raise RdmaError(RdmaConfig.install_hv_utils_failed) def rdmaUpdatePackage(self, host_version): error, output = RunGetOutput(self.zypper_path + " lr -u") From 455534070f094ac515f5792df40ef77a7f736629 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Mon, 21 Dec 2015 17:46:04 +0800 Subject: [PATCH 03/12] add comment. --- waagent | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/waagent b/waagent index bfd3c72..93a4605 100644 --- a/waagent +++ b/waagent @@ -980,7 +980,7 @@ class SuSEDistro(AbstractDistro): if(error == RdmaConfig.process_success): r = re.search("Version: (\S+)", output) if r is not None: - package_version = r.groups()[0]# e.g. package_version is "20150707_k3.12.28_4-3.1.140.0" + package_version = r.groups()[0] # e.g. package_version is "20150707.140.0_k3.12.28_4-3.1." return package_version else: return None @@ -1008,6 +1008,7 @@ class SuSEDistro(AbstractDistro): def rdmaUpdate(self): check_install_result = self.checkInstallHyperV() if(check_install_result == RdmaConfig.process_success): + # wait for sometime the RDMA Driver not passed in by KVP in time. time.sleep(40) check_result = self.checkRDMA() Log("RDMA version check result is " + str(check_result)) From e9d1f3097b0af6581ef81816807f7f92a8c3716e Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Tue, 22 Dec 2015 09:58:29 +0800 Subject: [PATCH 04/12] more error handling. --- waagent | 104 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/waagent b/waagent index 93a4605..4eb476d 100644 --- a/waagent +++ b/waagent @@ -359,7 +359,7 @@ class AbstractDistro(object): return self.chpasswd(user, password, crypt_id=crypt_id, salt_len=salt_len) - + def chpasswd(self, username, password, crypt_id=6, salt_len=10): passwd_hash = self.gen_password_hash(password, crypt_id, salt_len) cmd = "usermod -p '{0}' {1}".format(passwd_hash, username) @@ -381,7 +381,7 @@ class AbstractDistro(object): Generic function to remove ata_piix.ko. """ return WaAgent.TryUnloadAtapiix() - + def deprovisionWarnUser(self): """ Generic user warnings used at deprovision. @@ -403,7 +403,7 @@ class AbstractDistro(object): except: pass return 0 - + def uninstallDeleteFiles(self): """ Files to delete when agent is uninstalled. @@ -414,7 +414,7 @@ class AbstractDistro(object): except: pass return 0 - + def checkDependencies(self): """ Generic dependency check. @@ -566,7 +566,7 @@ class AbstractDistro(object): if Run("LC_ALL=C fdisk -l " + dsk + " | grep Disk"): return False return True - + def mountDVD(self,dvd,location): return RunGetOutput(self.mount_dvd_cmd + ' ' + dvd + ' ' + location) @@ -700,7 +700,7 @@ class AbstractDistro(object): errMsg = 'Failed to enable the extension with error: %s, stack trace: %s' % (str(e), traceback.format_exc()) Log("Can't update status: " + errMsg) raise RdmaError(RdmaConfig.nd_driver_detect_error) - + def checkInstallHyperV(self): return None @@ -708,9 +708,11 @@ class AbstractDistro(object): return None def rdmaUpdate(self): + Log("rdmaUpdate in base class") pass def checkRDMA(self): + Log("checkRDMA in base class") pass ############################################################ @@ -911,7 +913,13 @@ class SuSEDistro(AbstractDistro): """ def __init__(self): super(SuSEDistro,self).__init__() + dist_info = DistInfo() + dist_info_fullname = DistInfo(fullname=1) + self.dhcp_client_name = 'dhcpcd' + if ((dist_info_fullname[0] == 'SUSE Linux Enterprise Server' and dist_info[1] >= '12') or \ + (dist_info_fullname[0] == 'openSUSE' and dist_info[1] >= '13.2')): + self.dhcp_client_name = 'wickedd-dhcp4' self.dhcp_enabled = True self.grubKernelBootOptionsFile = '/boot/grub/menu.lst' self.grubKernelBootOptionsLine = 'kernel' @@ -920,21 +928,16 @@ class SuSEDistro(AbstractDistro): self.init_file = suse_init_file self.kernel_boot_options_file = '/boot/grub/menu.lst' self.modprobe_path = '/usr/bin/modprobe' - + self.requiredDeps += [ "/sbin/insserv" ] self.reboot_path = '/sbin/reboot' self.service_cmd = '/sbin/service' self.ssh_service_name ='sshd' - dist_info = DistInfo() - dist_info_fullname = DistInfo(fullname=1) if(dist_info[1] == "11"): self.ps_path = '/bin/ps' else: self.ps_path = '/usr/bin/ps' - if ((dist_info_fullname[0] == 'SUSE Linux Enterprise Server' and dist_info[1] >= '12') or \ - (dist_info_fullname[0] == 'openSUSE' and dist_info[1] >= '13.2')): - self.dhcp_client_name = 'wickedd-dhcp4' self.zypper_path = '/usr/bin/zypper' def checkPackageInstalled(self,p): @@ -994,33 +997,45 @@ class SuSEDistro(AbstractDistro): else: r = re.search("hv_kvp_daemon", output) if r is None : - Log("KVP deamon is not running, install it") - error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") - Log("install hyper-v return code: " + str(error) + " output:" + str(output)) - if(error != RdmaConfig.process_success): - return RdmaConfig.common_failed - self.rebootMachine() - return RdmaConfig.process_success + # if the + error,output = RunGetOutput(self.service_cmd+ " hv_kvp_daemon status") + if(error == RdmaConfig.process_success): + Log("the hv_kvp_daemon service is there, bug not started.") + return RdmaConfig.hv_kvp_daemon_not_started + else: + Log("KVP deamon is not running and service not there, install it") + error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") + Log("install hyper-v return code: " + str(error) + " output:" + str(output)) + if(error != RdmaConfig.process_success): + return RdmaConfig.common_failed + self.rebootMachine() + return RdmaConfig.process_success else : Log("KVP deamon is running") return RdmaConfig.process_success def rdmaUpdate(self): + # give some time for the hv_hvp_daemon to start up. + time.sleep(10) check_install_result = self.checkInstallHyperV() if(check_install_result == RdmaConfig.process_success): # wait for sometime the RDMA Driver not passed in by KVP in time. - time.sleep(40) - check_result = self.checkRDMA() - Log("RDMA version check result is " + str(check_result)) - if(check_result == RdmaConfig.UpToDate): - return - elif(check_result == RdmaConfig.OutOfDate): - nd_driver_version = self.getNdDriverVersion() - update_rdma_driver_result = self.rdmaUpdatePackage(nd_driver_version) - elif(check_result == RdmaConfig.DriverVersionNotFound): + time.sleep(20) + + nd_driver_version = self.getNdDriverVersion() + if(nd_driver_version is None): raise RdmaError(RdmaConfig.driver_version_not_found) - elif(check_result == RdmaConfig.Unknown): - raise RdmaError(RdmaConfig.unknown_error) + else: + check_result = self.checkRDMA(nd_driver_version) + Log("RDMA version check result is " + str(check_result)) + if(check_result == RdmaConfig.UpToDate): + return + elif(check_result == RdmaConfig.OutOfDate): + update_rdma_driver_result = self.rdmaUpdatePackage(nd_driver_version) + elif(check_result == RdmaConfig.DriverVersionNotFound): + raise RdmaError(RdmaConfig.driver_version_not_found) + elif(check_result == RdmaConfig.Unknown): + raise RdmaError(RdmaConfig.unknown_error) else: raise RdmaError(RdmaConfig.install_hv_utils_failed) @@ -1061,8 +1076,9 @@ class SuSEDistro(AbstractDistro): Log("RDMA drivers not found in /opt/microsoft/rdma") raise RdmaError(RdmaConfig.package_not_found) - def checkRDMA(self): - nd_driver_version = self.getNdDriverVersion() + def checkRDMA(self, nd_driver_version = None): + if(nd_driver_version is None): + nd_driver_version = self.getNdDriverVersion() if(nd_driver_version is None or nd_driver_version == ""): return RdmaConfig.DriverVersionNotFound package_version = self.getRdmaPackageVersion() @@ -1496,7 +1512,7 @@ class debianDistro(AbstractDistro): return 1 else: return 0 - + def checkDependencies(self): """ Debian dependency check. python-pyasn1 is NOT needed. @@ -1517,7 +1533,7 @@ class debianDistro(AbstractDistro): return 1 else: return 0 - + def installAgentServiceScriptFiles(self): """ If we are packaged - the service name is walinuxagent, do nothing. @@ -1531,20 +1547,20 @@ class debianDistro(AbstractDistro): ErrorWithPrefix('installAgentServiceScriptFiles','Exception: '+str(e)+' occured creating ' + self.init_script_file) return 1 return 0 - + def registerAgentService(self): if self.installAgentServiceScriptFiles() == 0: return Run('update-rc.d waagent defaults') else : return 1 - + def uninstallAgentService(self): return Run('update-rc.d -f ' + self.agent_service_name + ' remove') def unregisterAgentService(self): self.stopAgentService() return self.uninstallAgentService() - + def sshDeployPublicKey(self,fprint,path): """ We support PKCS8. @@ -1945,7 +1961,7 @@ class FreeBSDDistro(AbstractDistro): self.mount_dvd_cmd = 'dd bs=2048 count=33 skip=295 if=' # custom data max len is 64k self.sudoers_dir_base = '/usr/local/etc' self.waagent_conf_file = FreeBSDWaagentConf - + def installAgentServiceScriptFiles(self): SetFileContents(self.init_script_file, self.init_file) os.chmod(self.init_script_file, 0777) @@ -1956,7 +1972,6 @@ class FreeBSDDistro(AbstractDistro): self.installAgentServiceScriptFiles() return Run("services_mkdb " + self.init_script_file) - def sshDeployPublicKey(self,fprint,path): """ We support PKCS8. @@ -2143,7 +2158,7 @@ class FreeBSDDistro(AbstractDistro): ChangeOwner(dir + "/authorized_keys", user) Log("Created user account: " + user) return None - + def DeleteAccount(self,user): """ Delete the 'user'. @@ -2233,12 +2248,12 @@ class FreeBSDDistro(AbstractDistro): Log("Configured SSH client probing to keep connections alive.") #ApplyVNUMAWorkaround() return 0 - + def mediaHasFilesystem(self,dsk): if Run('LC_ALL=C fdisk -p ' + dsk + ' | grep "invalid fdisk partition table found" ',False): return False return True - + def mountDVD(self,dvd,location): #At this point we cannot read a joliet option udf DVD in freebsd10 - so we 'dd' it into our location retcode,out = RunGetOutput(self.mount_dvd_cmd + dvd + ' of=' + location + '/ovf-env.xml') @@ -2274,10 +2289,10 @@ class FreeBSDDistro(AbstractDistro): def getProcessorCores(self): return int(RunGetOutput("sysctl hw.ncpu | awk '{print $2}'")[1]) - + def getTotalMemory(self): return int(RunGetOutput("sysctl hw.realmem | awk '{print $2}'")[1])/1024 - + def setDefaultGateway(self, gateway): Run("/sbin/route add default " + gateway, chk_err=False) @@ -3603,6 +3618,7 @@ class RdmaConfig(object): unknown_error = 5 package_not_found = 6 package_install_failed = 7 + hv_kvp_daemon_not_started = 8 """ check_rdma_result """ From cd185030461a1f500dfde52f40084b35b6dfa9bf Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Tue, 22 Dec 2015 10:34:59 +0800 Subject: [PATCH 05/12] expose the RdmaRepository as a parameter, so the distro vendor can configure it when doing the image. --- config/waagent.conf | 1 + waagent | 70 +++++++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/config/waagent.conf b/config/waagent.conf index d511ce9..2cc697b 100644 --- a/config/waagent.conf +++ b/config/waagent.conf @@ -87,3 +87,4 @@ OS.OpensslPath=None # If set, agent will try to update or check the rdma driver OS.UpdateRdmaDriver=y OS.CheckRdmaDriver=y +OS.RdmaRepository=https://drivers.suse.com/microsoft/Microsoft-LIS-RDMA/sle-12/updates diff --git a/waagent b/waagent index 4eb476d..0c8dccc 100644 --- a/waagent +++ b/waagent @@ -707,7 +707,7 @@ class AbstractDistro(object): def getRdmaPackageVersion(self): return None - def rdmaUpdate(self): + def rdmaUpdate(self,updateRdmaRepository=None): Log("rdmaUpdate in base class") pass @@ -1014,24 +1014,24 @@ class SuSEDistro(AbstractDistro): Log("KVP deamon is running") return RdmaConfig.process_success - def rdmaUpdate(self): + def rdmaUpdate(self,updateRdmaRepository=None): # give some time for the hv_hvp_daemon to start up. time.sleep(10) check_install_result = self.checkInstallHyperV() if(check_install_result == RdmaConfig.process_success): # wait for sometime the RDMA Driver not passed in by KVP in time. - time.sleep(20) + time.sleep(10) nd_driver_version = self.getNdDriverVersion() if(nd_driver_version is None): raise RdmaError(RdmaConfig.driver_version_not_found) else: - check_result = self.checkRDMA(nd_driver_version) + check_result = self.checkRDMA(nd_driver_version=nd_driver_version) Log("RDMA version check result is " + str(check_result)) if(check_result == RdmaConfig.UpToDate): return elif(check_result == RdmaConfig.OutOfDate): - update_rdma_driver_result = self.rdmaUpdatePackage(nd_driver_version) + update_rdma_driver_result = self.rdmaUpdatePackage(host_version=nd_driver_version,updateRdmaRepository=updateRdmaRepository) elif(check_result == RdmaConfig.DriverVersionNotFound): raise RdmaError(RdmaConfig.driver_version_not_found) elif(check_result == RdmaConfig.Unknown): @@ -1039,19 +1039,22 @@ class SuSEDistro(AbstractDistro): else: raise RdmaError(RdmaConfig.install_hv_utils_failed) - def rdmaUpdatePackage(self, host_version): - error, output = RunGetOutput(self.zypper_path + " lr -u") - rdma_pack_repository_name = "msft-rdma-pack" - rdma_pack_result = re.search(rdma_pack_repository_name, output) - if rdma_pack_result is None : - Log("rdma_pack_result is None") - error, output = RunGetOutput(self.zypper_path + " ar https://drivers.suse.com/microsoft/Microsoft-LIS-RDMA/sle-12/updates " + rdma_pack_repository_name) - #wait for the cache build. - time.sleep(20) - Log("error result is " + str(error) + " output is : " + str(output)) - else: - Log("output is: " + str(output)) - Log("msft-rdma-pack found") + def rdmaUpdatePackage(self, host_version, updateRdmaRepository = None): + # check the repository first + if(updateRdmaRepository is not None): + error,output = RunGetOutput(self.zypper_path + " lr -u") + rdma_pack_repository_name = "msft-rdma-pack" + rdma_pack_result = re.search(rdma_pack_repository_name, output) + if rdma_pack_result is None : + Log("rdma_pack_result is None") + error, output = RunGetOutput(self.zypper_path + " ar " + str(updateRdmaRepository) + " " + rdma_pack_repository_name) + #wait for the cache build. + time.sleep(20) + Log("error result is " + str(error) + " output is : " + str(output)) + else: + Log("output is: " + str(output)) + Log("msft-rdma-pack found") + returnCode, message = RunGetOutput(self.zypper_path + " --no-gpg-checks refresh") Log("refresh repro return code is " + str(returnCode) + " output is: " + str(message)) #install the wrapper package, that will put the driver RPM packages under /opt/microsoft/rdma @@ -1249,7 +1252,7 @@ class centosDistro(redhatDistro): def __init__(self): super(centosDistro,self).__init__() - def rdmaUpdate(self): + def rdmaUpdate(self,updateRdmaRepository=None): pass def checkRDMA(self): @@ -3628,7 +3631,7 @@ class RdmaConfig(object): Unknown = -1 class RdmaError(Exception): - def __init__(error_code = RdmaConfig.process_success): + def __init__(self, error_code = RdmaConfig.process_success): self.error_code = error_code class RdmaHandler(object): @@ -5888,17 +5891,22 @@ class Agent(Util): if lbProbeResponderNo: lbProbeResponder = False - updateRdmaDriverConfigured = Config.yes("OS.UpdateRdmaDriver") - if(updateRdmaDriverConfigured): - MyDistro.rdmaUpdate() - else: - Log("OS.UpdateRdmaDriver configured to "+str(updateRdmaDriverConfigured)+" so skip the rdma update.") - checkRdmaDriverConfigured = Config.yes("OS.CheckRdmaDriver") - if(checkRdmaDriverConfigured): - checkRdmaResult = MyDistro.checkRDMA() - Log("Rdma check result is " + str(checkRdmaResult)) - else: - Log("OS.CheckRdmaDriver configured to "+str(checkRdmaDriverConfigured)+" so skip the rdma check.") + try: + updateRdmaDriverConfigured = Config.yes("OS.UpdateRdmaDriver") + updateRdmaRepository = Config.get("OS.RdmaRepository") + if(updateRdmaDriverConfigured): + MyDistro.rdmaUpdate(updateRdmaRepository) + else: + Log("OS.UpdateRdmaDriver configured to "+str(updateRdmaDriverConfigured)+" so skip the rdma update.") + checkRdmaDriverConfigured = Config.yes("OS.CheckRdmaDriver") + if(checkRdmaDriverConfigured): + checkRdmaResult = MyDistro.checkRDMA() + Log("Rdma check result is " + str(checkRdmaResult)) + else: + Log("OS.CheckRdmaDriver configured to "+str(checkRdmaDriverConfigured)+" so skip the rdma check.") + except Exception as e: + errMsg = 'check or update Rdma driver failed with error: %s, stack trace: %s' % (str(e), traceback.format_exc()) + Error(errMsg) while True: if (goalState == None) or (incarnation == None) or (goalState.Incarnation != incarnation): From 6d2ff32846087b2b493b7e3e441e1358746bd42c Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Tue, 22 Dec 2015 11:45:34 +0800 Subject: [PATCH 06/12] hyper-v installation check. --- waagent | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/waagent b/waagent index 0c8dccc..dc6dfb2 100644 --- a/waagent +++ b/waagent @@ -995,21 +995,28 @@ class SuSEDistro(AbstractDistro): if(error != RdmaConfig.process_success): return RdmaConfig.common_failed else: - r = re.search("hv_kvp_daemon", output) + hv_kvp_daemon_service_process_name = "hv_kvp_daemon" + hv_kvp_daemon_service_name = "hv_kvp_daemon" + r = re.search(hv_kvp_daemon_service_process_name, output) if r is None : # if the - error,output = RunGetOutput(self.service_cmd+ " hv_kvp_daemon status") + Log("hv kvp daemon is not running.") + error,output = RunGetOutput(self.service_cmd+ " --status-all") if(error == RdmaConfig.process_success): - Log("the hv_kvp_daemon service is there, bug not started.") - return RdmaConfig.hv_kvp_daemon_not_started + hv_kvp_result = re.search(hv_kvp_daemon_service_name, output) + if hv_kvp_result is None : + Log("KVP service not there, install it") + error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") + Log("install hyper-v return code: " + str(error) + " output:" + str(output)) + if(error != RdmaConfig.process_success): + return RdmaConfig.common_failed + self.rebootMachine() + return RdmaConfig.process_success + else: + Log("the hv_kvp_daemon service is there, but not started.") + return RdmaConfig.hv_kvp_daemon_not_started else: - Log("KVP deamon is not running and service not there, install it") - error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") - Log("install hyper-v return code: " + str(error) + " output:" + str(output)) - if(error != RdmaConfig.process_success): - return RdmaConfig.common_failed - self.rebootMachine() - return RdmaConfig.process_success + return RdmaConfig.common_failed else : Log("KVP deamon is running") return RdmaConfig.process_success From f3ff3099cc7330629f764ccd1b183b42fcd0f160 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Tue, 22 Dec 2015 13:30:23 +0800 Subject: [PATCH 07/12] use the package check for the hyper-v instead of the service. --- waagent | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/waagent b/waagent index dc6dfb2..17cbe44 100644 --- a/waagent +++ b/waagent @@ -931,6 +931,7 @@ class SuSEDistro(AbstractDistro): self.requiredDeps += [ "/sbin/insserv" ] self.reboot_path = '/sbin/reboot' + self.rpm_path = '/bin/rpm' self.service_cmd = '/sbin/service' self.ssh_service_name ='sshd' if(dist_info[1] == "11"): @@ -1001,22 +1002,18 @@ class SuSEDistro(AbstractDistro): if r is None : # if the Log("hv kvp daemon is not running.") - error,output = RunGetOutput(self.service_cmd+ " --status-all") + error,output = RunGetOutput(self.rpm_path + " -q hyper-v") if(error == RdmaConfig.process_success): - hv_kvp_result = re.search(hv_kvp_daemon_service_name, output) - if hv_kvp_result is None : - Log("KVP service not there, install it") - error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") - Log("install hyper-v return code: " + str(error) + " output:" + str(output)) - if(error != RdmaConfig.process_success): - return RdmaConfig.common_failed + Log("the hyper-v package is installed, but hv_kvp_daemon not started") + return RdmaConfig.hv_kvp_daemon_not_started + else: + error,output = RunGetOutput(self.zypper_path + " -n install --force hyper-v") + Log("install hyper-v return code: " + str(error) + " output:" + str(output)) + if(error != RdmaConfig.process_success): + return RdmaConfig.common_failed + else: self.rebootMachine() return RdmaConfig.process_success - else: - Log("the hv_kvp_daemon service is there, but not started.") - return RdmaConfig.hv_kvp_daemon_not_started - else: - return RdmaConfig.common_failed else : Log("KVP deamon is running") return RdmaConfig.process_success @@ -1044,7 +1041,7 @@ class SuSEDistro(AbstractDistro): elif(check_result == RdmaConfig.Unknown): raise RdmaError(RdmaConfig.unknown_error) else: - raise RdmaError(RdmaConfig.install_hv_utils_failed) + raise RdmaError(RdmaConfig.check_install_hv_utils_failed) def rdmaUpdatePackage(self, host_version, updateRdmaRepository = None): # check the repository first @@ -3622,7 +3619,7 @@ class RdmaConfig(object): """ process_success = 0 common_failed = 1 - install_hv_utils_failed = 2 + check_install_hv_utils_failed = 2 nd_driver_detect_error = 3 driver_version_not_found = 4 unknown_error = 5 From ba51a3f24498c15f66a790fc8d3ef10b29c66b6d Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Wed, 23 Dec 2015 15:01:05 +0800 Subject: [PATCH 08/12] log improvement and one typo. --- .vs/WALinuxAgent/v14/.suo | Bin 0 -> 38912 bytes waagent | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 .vs/WALinuxAgent/v14/.suo diff --git a/.vs/WALinuxAgent/v14/.suo b/.vs/WALinuxAgent/v14/.suo new file mode 100644 index 0000000000000000000000000000000000000000..6f7b22c9ee11e4dcaff2b2b49fa93c713f345606 GIT binary patch literal 38912 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 literal 0 HcmV?d00001 diff --git a/waagent b/waagent index 17cbe44..94ef8e5 100644 --- a/waagent +++ b/waagent @@ -697,8 +697,8 @@ class AbstractDistro(object): Log("Error: NdDriverVersion not found.") return None except Exception as e: - errMsg = 'Failed to enable the extension with error: %s, stack trace: %s' % (str(e), traceback.format_exc()) - Log("Can't update status: " + errMsg) + errMsg = 'Cannot update status: Failed to enable the extension with error: %s, stack trace: %s' % (str(e), traceback.format_exc()) + Log(errMsg) raise RdmaError(RdmaConfig.nd_driver_detect_error) def checkInstallHyperV(self): @@ -1015,7 +1015,7 @@ class SuSEDistro(AbstractDistro): self.rebootMachine() return RdmaConfig.process_success else : - Log("KVP deamon is running") + Log("KVP daemon is running") return RdmaConfig.process_success def rdmaUpdate(self,updateRdmaRepository=None): From d5ebfc96b677ed36c5d9cf947f75d1bc8e9e42b8 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Wed, 23 Dec 2015 15:41:17 +0800 Subject: [PATCH 09/12] fix one typo --- waagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waagent b/waagent index 94ef8e5..8746f55 100644 --- a/waagent +++ b/waagent @@ -1060,7 +1060,7 @@ class SuSEDistro(AbstractDistro): Log("msft-rdma-pack found") returnCode, message = RunGetOutput(self.zypper_path + " --no-gpg-checks refresh") - Log("refresh repro return code is " + str(returnCode) + " output is: " + str(message)) + Log("refresh repo return code is " + str(returnCode) + " output is: " + str(message)) #install the wrapper package, that will put the driver RPM packages under /opt/microsoft/rdma returnCode, message = RunGetOutput(self.zypper_path + " -n remove " + RdmaConfig.wrapper_package_name) Log("remove wrapper package return code is " + str(returnCode) + " output is: " + str(message)) From e4f78df9f8d703733d2a1db9ad2fcad4a7340fdb Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Mon, 28 Dec 2015 13:21:33 +0800 Subject: [PATCH 10/12] we should not make it a error case if the hyper-v is not installed for the first time. --- waagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waagent b/waagent index 8746f55..3c72cf1 100644 --- a/waagent +++ b/waagent @@ -1002,7 +1002,7 @@ class SuSEDistro(AbstractDistro): if r is None : # if the Log("hv kvp daemon is not running.") - error,output = RunGetOutput(self.rpm_path + " -q hyper-v") + error,output = RunGetOutput(self.rpm_path + " -q hyper-v", chk_err=False,log_cmd=False) if(error == RdmaConfig.process_success): Log("the hyper-v package is installed, but hv_kvp_daemon not started") return RdmaConfig.hv_kvp_daemon_not_started From e5c598314b615068701a3e22517a0264485d08e7 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Wed, 6 Jan 2016 13:52:02 +0800 Subject: [PATCH 11/12] ignore the the project files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 27fe270..9a09f15 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,7 @@ tests/status_blob_url.py build dist *.egg-info +.vs/WALinuxAgent/v14/.suo +WALinuxAgent.pyproj +WALinuxAgent.pyproj.user +WALinuxAgent.sln From fe0782c7c06bd44fb1193d3df399a17f1715d5a5 Mon Sep 17 00:00:00 2001 From: andyliuliming Date: Wed, 6 Jan 2016 13:59:04 +0800 Subject: [PATCH 12/12] remove the rubbish. --- .vs/WALinuxAgent/v14/.suo | Bin 38912 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .vs/WALinuxAgent/v14/.suo diff --git a/.vs/WALinuxAgent/v14/.suo b/.vs/WALinuxAgent/v14/.suo deleted file mode 100644 index 6f7b22c9ee11e4dcaff2b2b49fa93c713f345606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38912 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