X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=system%2FTestPlc.py;h=9555a990b905e74a86859895cc78303fd94f6b51;hb=21e1bb59c72625e686028a83a39cd4675ca39181;hp=7a23d70d7e05c5d1e9ebb1c47c8c1e5a452ed96c;hpb=cd9b2d06d4564c0121963adbe74352651db67ffe;p=tests.git diff --git a/system/TestPlc.py b/system/TestPlc.py index 7a23d70..9555a99 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -245,7 +245,7 @@ class TestPlc: # warning, we're now building 'sface' so let's be a bit more picky # full builds are expected to return with 0 here utils.header("Checking if build provides SFA package...") - retcod = utils.system("curl --silent {}/ | grep -q sfa-".format(rpms_url)) == 0 + retcod = utils.system("curl --silent {}/ | grep -q sfa-4".format(rpms_url)) == 0 encoded = 'yes' if retcod else 'no' with open(has_sfa_cache_filename,'w') as cache: cache.write(encoded) @@ -358,8 +358,8 @@ class TestPlc: # self.run_in_guest("yum-complete-transaction -y") return self.dnf_check_installed(rpms) - def pip_install(self, package): - return self.run_in_guest("pip3 install {}".format(package)) == 0 + def pip3_install(self, package): + return self.run_in_guest(f"pip3 install {package} || pip install {package}") == 0 def auth_root(self): return {'Username' : self.plc_spec['settings']['PLC_ROOT_USER'], @@ -703,6 +703,28 @@ class TestPlc: for level in [ 'arch' ]: repo_url = os.path.dirname(repo_url) + ########## + # on the virsh containers, DNS resolution using gethostbyaddr + # won't work fine, for the hosts under .pl.sophia.inria.fr + # although these IPs can be reversed from virtually everywhere else + # + # this has started with something around fedora35 so I am suspecting python-3.10 + # + # in any case, here's a quick and dirty workaround, as I have bumped my head + # against the screen for two good hours and not found any single clue + # about how to deal with this properly + + import subprocess + + def workaround_gethostaddr(ip): + command = f"host {ip} 8.8.8.8" + completed = subprocess.run(command, shell=True, capture_output=True) + pieces = completed.stdout.decode().split("domain name pointer ") + if len(pieces) == 2: + return pieces[1].replace(".\n", "") + else: + return None + # invoke initvm (drop support for vs) script = "lbuild-initvm.sh" script_options = "" @@ -714,11 +736,14 @@ class TestPlc: vserver_name = self.vservername try: vserver_hostname = socket.gethostbyaddr(self.vserverip)[0] - script_options += " -n {}".format(vserver_hostname) except: - print("Cannot reverse lookup {}".format(self.vserverip)) - print("This is considered fatal, as this might pollute the test results") - return False + # read more above about this workaround + vserver_hostname = workaround_gethostaddr(self.vserverip) + if not vserver_hostname: + print("Cannot reverse lookup {}".format(self.vserverip)) + print("This is considered fatal, as this might pollute the test results") + return False + script_options += " -n {}".format(vserver_hostname) create_vserver="{build_dir}/{script} {script_options} {vserver_name}".format(**locals()) return self.run_in_host(create_vserver) == 0 @@ -729,7 +754,7 @@ class TestPlc: """ pip install Django """ - return self.pip_install('Django') + return self.pip3_install('Django') ### install_rpm def plc_install(self): @@ -1519,24 +1544,63 @@ class TestPlc: # in particular runs with --preserve (dont cleanup) and without --check # also it gets run twice, once with the --foreign option for creating fake foreign entries + def install_pip2(self): + + replacements = [ + "http://mirror.onelab.eu/third-party/python2-pip-19.1.1-7.fc33.noarch.rpm", + ] + + return ( + self.run_in_guest("pip2 --version") == 0 + or self.run_in_guest("dnf install python2-pip") == 0 + or self.run_in_guest("dnf localinstall -y " + " ".join(replacements)) == 0) + + + def install_m2crypto(self): + + # installing m2crypto for python2 is increasingly difficult + # f29 and f31: dnf install python2-m2crypto + # f33: no longer available but the f31 repos below do the job just fine + # note that using pip2 does not look like a viable option because it does + # an install from sources and that's quite awkward + + replacements = [ + # no longer on our mirror + "https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/31/Everything/x86_64/os/Packages/p/python2-typing-3.6.2-5.fc31.noarch.rpm", + "https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/31/Everything/x86_64/os/Packages/p/python2-m2crypto-0.35.2-2.fc31.x86_64.rpm", + ] + + return ( + self.run_in_guest('python2 -c "import M2Crypto"', backslash=True) == 0 + or self.run_in_guest("pip2 install python2-m2crypto") == 0 + or self.run_in_guest("dnf localinstall -y " + " ".join(replacements)) == 0) + + # about pip2: the logic goes like this + # check for pip2 command + # if not, try dnf install python2-pip + # if still not, dnf localinstall the above + + def sfa_install_all(self): "yum install sfa sfa-plc sfa-sfatables sfa-client" - # python2- rpm/dnf packages ar getting deprecated - dnf_dependencies = [ - "m2crypto" - ] + # the rpm/dnf packages named in python2-* are getting deprecated + # we use pip2 instead + # but that's not good for m2crypto + pip_dependencies = [ 'sqlalchemy-migrate', 'lxml', 'python-dateutil', 'psycopg2-binary', + 'pyOpenSSL', ] - dnf_deps = all((self.run_in_guest(f"dnf -y install {dep}") == 0) - for dep in dnf_dependencies) - pip_deps = all((self.run_in_guest(f"pip2 install {dep}") == 0) - for dep in pip_dependencies) - return (dnf_deps and pip_deps + + return ( + self.install_pip2() + and self.install_m2crypto() + and all((self.run_in_guest(f"pip2 install {dep}") == 0) + for dep in pip_dependencies) and self.dnf_install("sfa sfa-plc sfa-sfatables sfa-client") and self.run_in_guest("systemctl enable sfa-registry")==0 and self.run_in_guest("systemctl enable sfa-aggregate")==0)