def getPrimaryStorageUrl(self, key, ref): if not ref.has_key("XRT_PriStorageType"): storageType = "NFS" else: storageType = ref['XRT_PriStorageType'] if storageType == "NFS": if ref.has_key('XRT_Guest_NFS'): ssGuest = xenrt.TEC().registry.guestGet(ref['XRT_Guest_NFS']) xenrt.TEC().logverbose( 'Using guest %s for primary NFS storage' % (ssGuest.name)) shareName = 'PS-%s-%s' % (self.currentClusterName, ''.join( random.sample( string.ascii_lowercase + string.ascii_uppercase, 6))) storagePath = ssGuest.createLinuxNfsShare(shareName) url = 'nfs://%s' % (storagePath.replace(':', '')) else: primaryStorage = xenrt.ExternalNFSShare() url = 'nfs://%s' % (primaryStorage.getMount().replace(':', '')) elif storageType == "SMB": h = xenrt.GEC().registry.hostGet("RESOURCE_HOST_%s" % ref['XRT_SMBHostId']) ip = h.getFQDN() url = "cifs://%s/storage/primary" % (ip) ad = xenrt.getADConfig() return url
def reconfigureToStatic(self, ad=False): data = self.getWindowsIPConfigData() ifname = [ x for x in data.keys() if data[x].has_key('IPv4 Address') and ( data[x]['IPv4 Address'] == self.machine.ipaddr or data[x] ['IPv4 Address'] == "%s(Preferred)" % self.machine.ipaddr) ][0] netcfg = xenrt.TEC().lookup(["NETWORK_CONFIG", "DEFAULT"]) cmd = "netsh interface ip set address \"%s\" static %s %s %s 1" % ( ifname, self.machine.ipaddr, data[ifname]['Subnet Mask'], [ x for x in data[ifname]['Default Gateway'].split() if re.match("\d+\.\d+\.\d+\.\d+", x) ][0]) ref = self.xmlrpcStart(cmd) deadline = xenrt.timenow() + 120 while True: try: if self.xmlrpcPoll(ref): break except: pass if xenrt.timenow() > deadline: raise xenrt.XRTError("Timed out setting IP to static") xenrt.sleep(5) if ad: dns = xenrt.getADConfig().dns else: dns = xenrt.TEC().config.lookup("XENRT_SERVER_ADDRESS") cmd = "netsh interface ipv4 add dnsservers \"%s\" %s" % (ifname, dns) self.xmlrpcExec(cmd)
def getDomainController(self): if not self.domainController: ad = xenrt.getADConfig() self.domainController = xenrt.lib.generic.StaticOS( ad.dcDistro, ad.dcAddress) self.domainController.os.enablePowerShellUnrestricted() return self.domainController
def installCloudAgent(self, msi): ad = xenrt.getADConfig() if msi.endswith(".msi"): self.xmlrpcSendFile(msi, "c:\\hypervagent.msi") self.xmlrpcExec( "msiexec /i c:\\hypervagent.msi /quiet /qn /norestart /log c:\\cloudagent-install.log SERVICE_USERNAME=%s\\%s SERVICE_PASSWORD=%s" % (ad.domainName, ad.adminUser, ad.adminPassword)) elif msi.endswith(".zip"): tempDir = xenrt.TEC().tempDir() xenrt.command("unzip %s -d %s" % (msi, tempDir)) self.xmlrpcCreateDir("c:\\cshyperv") self.xmlrpcSendRecursive(tempDir, "c:\\cshyperv") self.xmlrpcExec( "c:\\cshyperv\\AgentShell.exe --install -u %s\\%s -p %s" % (ad.domainName, ad.adminUser, ad.adminPassword)) data = self.hypervCmd( "New-SelfSignedCertificate -DnsName apachecloudstack -CertStoreLocation Cert:\\LocalMachine\\My | Format-Wide -Property Thumbprint -autosize" ).strip() thumbprint = data.splitlines()[-1] self.xmlrpcExec( "netsh http add sslcert ipport=0.0.0.0:8250 certhash=%s appid=\"{727beb1c-6e7c-49b2-8fbd-f03dbe481b08}\"" % thumbprint) else: raise xenrt.XRTError("Unknown cloud agent file %s" % os.path.basename(msi))
def reconfigureToStatic(self, ad=False): data = self.getWindowsIPConfigData() ifname = [x for x in data.keys() if data[x].has_key('IPv4 Address') and (data[x]['IPv4 Address'] == self.machine.ipaddr or data[x]['IPv4 Address'] == "%s(Preferred)" % self.machine.ipaddr)][0] netcfg = xenrt.TEC().lookup(["NETWORK_CONFIG", "DEFAULT"]) cmd = "netsh interface ip set address \"%s\" static %s %s %s 1" % (ifname, self.machine.ipaddr, data[ifname]['Subnet Mask'], [x for x in data[ifname]['Default Gateway'].split() if re.match("\d+\.\d+\.\d+\.\d+", x)][0]) ref = self.xmlrpcStart(cmd) deadline = xenrt.timenow() + 120 while True: try: if self.xmlrpcPoll(ref): break except: pass if xenrt.timenow() > deadline: raise xenrt.XRTError("Timed out setting IP to static") xenrt.sleep(5) if ad: dns = xenrt.getADConfig().dns else: dns = xenrt.TEC().config.lookup("XENRT_SERVER_ADDRESS") cmd = "netsh interface ipv4 add dnsservers \"%s\" %s" % (ifname, dns) self.xmlrpcExec(cmd)
def setupDomainUserPermissions(self): ad = xenrt.getADConfig() self.xmlrpcExec("net localgroup Administrators %s\\%s /add" % (ad.domainName, ad.adminUser)) self.xmlrpcExec("net localgroup \"Hyper-V Administrators\" %s\\%s /add" % (ad.domainName, ad.adminUser)) self.xmlrpcSendFile("%s/data/tests/hyperv/logonasservice.ps1" % xenrt.TEC().lookup("XENRT_BASE"), "c:\\logonasservice.ps1") self.enablePowerShellUnrestricted() self.xmlrpcExec("powershell.exe c:\\logonasservice.ps1 \"%s\\%s\"" % (ad.domainName, ad.adminUser))
def enableDelegation(self, remoteHost, service): remote = remoteHost.xmlrpcGetEnvVar("COMPUTERNAME") myhost = self.xmlrpcGetEnvVar("COMPUTERNAME") ad = xenrt.getADConfig() script = """$ErrorActionPreference = "Stop" Get-ADComputer %s | Set-AdObject -Add @{"msDS-AllowedToDelegateTo"="%s/%s","%s/%s.%s"} Get-ADComputer %s -Properties msDS-AllowedToDelegateTo | Select-Object -ExpandProperty msDs-AllowedToDelegateTo """ % (myhost, service, remote, service, remote, ad.domain, myhost) xenrt.TEC().logverbose(self.getDomainController().os.cmdExec(script, powershell=True, returndata=True))
def joinDefaultDomain(self): self.rename(self.getName()) self.xmlrpcExec("netsh advfirewall set domainprofile state off") ad = xenrt.getADConfig() self.xmlrpcExec( "netdom join %s /domain:%s /userd:%s\\%s /passwordd:%s" % (self.getName(), ad.domain, ad.domainName, ad.adminUser, ad.adminPassword)) self.softReboot()
def getSecondaryStorageDetails(self, key, ref): if ref.has_key('provider') and ref['provider'] == "SMB": ad = xenrt.getADConfig() return { "user": ad.adminUser, "password": ad.adminPassword, "domain": ad.domainName } else: return None
def enableDelegation(self, remoteHost, service): remote = remoteHost.xmlrpcGetEnvVar("COMPUTERNAME") myhost = self.xmlrpcGetEnvVar("COMPUTERNAME") ad = xenrt.getADConfig() script = """$ErrorActionPreference = "Stop" Get-ADComputer %s | Set-AdObject -Add @{"msDS-AllowedToDelegateTo"="%s/%s","%s/%s.%s"} Get-ADComputer %s -Properties msDS-AllowedToDelegateTo | Select-Object -ExpandProperty msDs-AllowedToDelegateTo """ % (myhost, service, remote, service, remote, ad.domain, myhost) xenrt.TEC().logverbose(self.getDomainController().os.cmdExec( script, powershell=True, returndata=True))
def copySystemTemplatesToSecondaryStorage(self, storagePath, provider): # Load templates for this version templates = self.mgtSvr.lookup("SYSTEM_TEMPLATES", None) if not templates: raise xenrt.XRTError('Failed to find system templates') # Check if any non-default system templates have been specified # These should be added in the form -D CLOUD_TMPLT/hypervisor=url sysTemplates = xenrt.TEC().lookup("CLOUD_TMPLT", {}) for s in sysTemplates: templates[s] = sysTemplates[s] # Legacy XenServer template support sysTemplateSrcLocation = xenrt.TEC().lookup("CLOUD_SYS_TEMPLATE", None) if sysTemplateSrcLocation: xenrt.TEC().warning("Use of CLOUD_SYS_TEMPLATE is deprecated, use CLOUD_SYS_TEMPLATES/xenserver instead") templates['xenserver'] = sysTemplateSrcLocation hvlist = xenrt.TEC().lookup("CLOUD_REQ_SYS_TMPLS", None) if hvlist: hvlist = hvlist.split(",") else: hvlist = [] for t in templates.keys(): if t not in hvlist: del templates[t] xenrt.TEC().logverbose('Using System Templates: %s' % (templates)) webdir = xenrt.WebDirectory() if provider == 'NFS': self.mgtSvr.primaryManagementServer.execcmd('mount -t nfs -o nfsvers=3 %s /media' % (storagePath)) elif provider == 'SMB': ad = xenrt.getADConfig() self.mgtSvr.primaryManagementServer.execcmd('mount -t cifs %s /media -o user=%s,password=%s,domain=%s' % (storagePath, ad.adminUser, ad.adminPassword, ad.domainName)) installSysTmpltLoc = self.mgtSvr.primaryManagementServer.execcmd('find / -name *install-sys-tmplt -ignore_readdir_race 2> /dev/null || true').strip() for hv in templates: templateFile = xenrt.TEC().getFile(templates[hv]) xenrt.TEC().logverbose("Using %s system VM template %s (md5sum: %s)" % (hv, templates[hv], xenrt.command("md5sum %s" % templateFile))) if templateFile.endswith(".zip") and xenrt.TEC().lookup("WORKAROUND_CS22839", False, boolean=True): xenrt.TEC().warning("Using CS-22839 workaround") tempDir = xenrt.TEC().tempDir() xenrt.command("cd %s && unzip %s" % (tempDir, templateFile)) dirContents = glob.glob("%s/*" % tempDir) if len(dirContents) != 1: raise xenrt.XRTError("Unexpected contents of system template ZIP file") templateFile = dirContents[0] webdir.copyIn(templateFile) templateUrl = webdir.getURL(os.path.basename(templateFile)) if provider in ('NFS', 'SMB'): self.mgtSvr.primaryManagementServer.execcmd('%s -m /media -u %s -h %s -F' % (installSysTmpltLoc, templateUrl, hv), timeout=60*60) if provider in ('NFS', 'SMB'): self.mgtSvr.primaryManagementServer.execcmd('umount /media') webdir.remove()
def getPrimaryStorageDetails(self, key, ref): if ref.has_key( 'XRT_PriStorageType') and ref['XRT_PriStorageType'] == "SMB": ad = xenrt.getADConfig() return { "user": ad.adminUser, "password": ad.adminPassword, "domain": ad.domainName } else: return None
def setupDomainUserPermissions(self): ad = xenrt.getADConfig() self.xmlrpcExec("net localgroup Administrators %s\\%s /add" % (ad.domainName, ad.adminUser)) self.xmlrpcExec( "net localgroup \"Hyper-V Administrators\" %s\\%s /add" % (ad.domainName, ad.adminUser)) self.xmlrpcSendFile( "%s/data/tests/hyperv/logonasservice.ps1" % xenrt.TEC().lookup("XENRT_BASE"), "c:\\logonasservice.ps1") self.enablePowerShellUnrestricted() self.xmlrpcExec("powershell.exe c:\\logonasservice.ps1 \"%s\\%s\"" % (ad.domainName, ad.adminUser))
def installCloudAgent(self, msi): ad = xenrt.getADConfig() if msi.endswith(".msi"): self.xmlrpcSendFile(msi, "c:\\hypervagent.msi") self.xmlrpcExec("msiexec /i c:\\hypervagent.msi /quiet /qn /norestart /log c:\\cloudagent-install.log SERVICE_USERNAME=%s\\%s SERVICE_PASSWORD=%s" % (ad.domainName, ad.adminUser, ad.adminPassword)) elif msi.endswith(".zip"): tempDir = xenrt.TEC().tempDir() xenrt.command("unzip %s -d %s" % (msi, tempDir)) self.xmlrpcCreateDir("c:\\cshyperv") self.xmlrpcSendRecursive(tempDir, "c:\\cshyperv") self.xmlrpcExec("c:\\cshyperv\\AgentShell.exe --install -u %s\\%s -p %s" % (ad.domainName, ad.adminUser, ad.adminPassword)) data = self.hypervCmd("New-SelfSignedCertificate -DnsName apachecloudstack -CertStoreLocation Cert:\\LocalMachine\\My | Format-Wide -Property Thumbprint -autosize").strip() thumbprint = data.splitlines()[-1] self.xmlrpcExec("netsh http add sslcert ipport=0.0.0.0:8250 certhash=%s appid=\"{727beb1c-6e7c-49b2-8fbd-f03dbe481b08}\"" % thumbprint) else: raise xenrt.XRTError("Unknown cloud agent file %s" % os.path.basename(msi))
def getPrimaryStorageUrl(self, key, ref): if not ref.has_key("XRT_PriStorageType"): storageType = "NFS" else: storageType = ref['XRT_PriStorageType'] if storageType == "NFS": if ref.has_key('XRT_Guest_NFS'): ssGuest = xenrt.TEC().registry.guestGet(ref['XRT_Guest_NFS']) xenrt.TEC().logverbose('Using guest %s for primary NFS storage' % (ssGuest.name)) shareName = 'PS-%s-%s' % (self.currentClusterName, ''.join(random.sample(string.ascii_lowercase + string.ascii_uppercase, 6))) storagePath = ssGuest.createLinuxNfsShare(shareName) url = 'nfs://%s' % (storagePath.replace(':','')) else: primaryStorage = xenrt.ExternalNFSShare() url = 'nfs://%s' % (primaryStorage.getMount().replace(':','')) elif storageType == "SMB": h = xenrt.GEC().registry.hostGet("RESOURCE_HOST_%s" % ref['XRT_SMBHostId']) ip = h.getFQDN() url = "cifs://%s/storage/primary" % (ip) ad = xenrt.getADConfig() return url
def getFQDN(self): return "%s.%s" % (self.xmlrpcGetEnvVar("COMPUTERNAME"), xenrt.getADConfig().domain)
def copySystemTemplatesToSecondaryStorage(self, storagePath, provider): # Load templates for this version templates = self.mgtSvr.lookup("SYSTEM_TEMPLATES", None) if not templates: raise xenrt.XRTError('Failed to find system templates') # Check if any non-default system templates have been specified # These should be added in the form -D CLOUD_TMPLT/hypervisor=url sysTemplates = xenrt.TEC().lookup("CLOUD_TMPLT", {}) for s in sysTemplates: templates[s] = sysTemplates[s] # Legacy XenServer template support sysTemplateSrcLocation = xenrt.TEC().lookup("CLOUD_SYS_TEMPLATE", None) if sysTemplateSrcLocation: xenrt.TEC().warning( "Use of CLOUD_SYS_TEMPLATE is deprecated, use CLOUD_SYS_TEMPLATES/xenserver instead" ) templates['xenserver'] = sysTemplateSrcLocation hvlist = xenrt.TEC().lookup("CLOUD_REQ_SYS_TMPLS", None) if hvlist: hvlist = hvlist.split(",") else: hvlist = [] for t in templates.keys(): if t not in hvlist: del templates[t] xenrt.TEC().logverbose('Using System Templates: %s' % (templates)) webdir = xenrt.WebDirectory() if provider == 'NFS': self.mgtSvr.primaryManagementServer.execcmd( 'mount -t nfs -o nfsvers=3 %s /media' % (storagePath)) elif provider == 'SMB': ad = xenrt.getADConfig() self.mgtSvr.primaryManagementServer.execcmd( 'mount -t cifs %s /media -o user=%s,password=%s,domain=%s' % (storagePath, ad.adminUser, ad.adminPassword, ad.domainName)) installSysTmpltLoc = self.mgtSvr.primaryManagementServer.execcmd( 'find / -name *install-sys-tmplt -ignore_readdir_race 2> /dev/null || true' ).strip() for hv in templates: templateFile = xenrt.TEC().getFile(templates[hv]) xenrt.TEC().logverbose( "Using %s system VM template %s (md5sum: %s)" % (hv, templates[hv], xenrt.command("md5sum %s" % templateFile))) if templateFile.endswith(".zip") and xenrt.TEC().lookup( "WORKAROUND_CS22839", False, boolean=True): xenrt.TEC().warning("Using CS-22839 workaround") tempDir = xenrt.TEC().tempDir() xenrt.command("cd %s && unzip %s" % (tempDir, templateFile)) dirContents = glob.glob("%s/*" % tempDir) if len(dirContents) != 1: raise xenrt.XRTError( "Unexpected contents of system template ZIP file") templateFile = dirContents[0] webdir.copyIn(templateFile) templateUrl = webdir.getURL(os.path.basename(templateFile)) if provider in ('NFS', 'SMB'): self.mgtSvr.primaryManagementServer.execcmd( '%s -m /media -u %s -h %s -F' % (installSysTmpltLoc, templateUrl, hv), timeout=60 * 60) if provider in ('NFS', 'SMB'): self.mgtSvr.primaryManagementServer.execcmd('umount /media') webdir.remove()
def getSecondaryStorageDetails(self, key, ref): if ref.has_key('provider') and ref['provider'] == "SMB": ad = xenrt.getADConfig() return {"user":ad.adminUser, "password": ad.adminPassword, "domain": ad.domainName} else: return None
def getDomainController(self): if not self.domainController: ad = xenrt.getADConfig() self.domainController = xenrt.lib.generic.StaticOS(ad.dcDistro, ad.dcAddress) self.domainController.os.enablePowerShellUnrestricted() return self.domainController
def getPrimaryStorageDetails(self, key, ref): if ref.has_key('XRT_PriStorageType') and ref['XRT_PriStorageType'] == "SMB": ad = xenrt.getADConfig() return {"user":ad.adminUser, "password": ad.adminPassword, "domain": ad.domainName} else: return None
def joinDefaultDomain(self): self.rename(self.getName()) self.xmlrpcExec("netsh advfirewall set domainprofile state off") ad = xenrt.getADConfig() self.xmlrpcExec("netdom join %s /domain:%s /userd:%s\\%s /passwordd:%s" % (self.getName(), ad.domain, ad.domainName, ad.adminUser, ad.adminPassword)) self.softReboot()