From a3ddc1c7865b128b6a2bf3aa22876b238b0fb445 Mon Sep 17 00:00:00 2001 From: Dominik Perpeet Date: Tue, 20 Jun 2017 22:35:41 +0200 Subject: [PATCH 13/23] test: Update openshift tests to master Closes #7025 Reviewed-by: Stef Walter --- test/verify/check-openshift | 181 +++++++++++++++++++++++++++++++++++++++++--- test/verify/kubelib.py | 9 ++- 2 files changed, 178 insertions(+), 12 deletions(-) diff --git a/test/verify/check-openshift b/test/verify/check-openshift index 5c404e5..6b2236d 100755 --- a/test/verify/check-openshift +++ b/test/verify/check-openshift @@ -51,7 +51,7 @@ def wait_project(machine, project): i = i + 1 time.sleep(2) -@skipImage("Kubernetes not packaged", "debian-8", "debian-testing", "ubuntu-1604", "fedora-i386") +@skipImage("Kubernetes not packaged", "debian-stable", "debian-testing", "ubuntu-1604", "ubuntu-stable", "fedora-i386") @skipImage("No cockpit-kubernetes packaged", "continuous-atomic", "fedora-atomic", "rhel-atomic") class TestOpenshift(MachineCase, OpenshiftCommonTests): additional_machines = { @@ -63,12 +63,13 @@ class TestOpenshift(MachineCase, OpenshiftCommonTests): self.openshift = self.machines['openshift'] self.openshift.upload(["verify/files/mock-app-openshift.json"], "/tmp") - tmpfile = os.path.join(self.tmpdir, "config") - self.openshift.download("/root/.kube/config", tmpfile) + self.kubeconfig = os.path.join(self.tmpdir, "config") + self.openshift.download("/root/.kube/config", self.kubeconfig) m = self.machine - with open(tmpfile, "r") as f: - m.execute("mkdir -p /home/admin/.kube && cat > /home/admin/.kube/config", input=f.read()) + m.execute("mkdir -p /home/admin/.kube") + m.upload([self.kubeconfig], "/home/admin/.kube/config") + m.execute("chown -R admin:admin /home/admin/.kube") wait_project(self.openshift, "marmalade") @@ -124,7 +125,7 @@ class TestOpenshift(MachineCase, OpenshiftCommonTests): b.wait_present("a[href='#/volumes']") b.click("a[href='#/volumes']") b.wait_present(".pv-listing") - b.wait_in_text(".pv-listing", "cannot list all") + b.wait_in_text(".pv-listing", "cannot watch all") b.click("a[href='#/']") b.wait_present("#kubernetes-change-connection") @@ -145,7 +146,7 @@ class TestOpenshift(MachineCase, OpenshiftCommonTests): # Test the saved kube config file m.execute("rm /home/admin/.kube/config") - m.upload(["verify/files/openshift.kubeconfig"], "/home/admin/.kube/config") + m.upload([self.kubeconfig], "/home/admin/.kube/config") m.execute("chown -R admin:admin /home/admin/.kube") self.login_and_go("/kubernetes") @@ -304,7 +305,81 @@ LABEL io.projectatomic.nulecule.atomicappversion="0.1.11" \ b.wait_present(".details-listing tbody[data-id='pods/default/helloapache'] th") self.assertEqual(b.text(".details-listing tbody[data-id='pods/default/helloapache'] th"), "helloapache") -@skipImage("Kubernetes not packaged", "debian-8", "debian-testing", "ubuntu-1604", "fedora-i386") + def testReconnectChangeCert(self): + m = self.machine + b = self.browser + + # Try to connect with an old and non-matching client cert + old_cert = ('LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREVENDQWZXZ0F3SUJBZ0lCQnpBTkJna3Foa2' + 'lHOXcwQkFRc0ZBREFtTVNRd0lnWURWUVFEREJ0dmNHVnUKYzJocFpuUXRjMmxuYm1WeVFERTBPVEEy' + 'T0RFMk16RXdIaGNOTVRjd016STRNRFl4TXpVeVdoY05NVGt3TXpJNApNRFl4TXpVeldqQTNNUjR3SE' + 'FZRFZRUUtFeFZ6ZVhOMFpXMDZZMngxYzNSbGNpMWhaRzFwYm5NeEZUQVRCZ05WCkJBTVRESE41YzNS' + 'bGJUcGhaRzFwYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU5Rel' + 'J5SzUzQUhmdlZnME5GTHRSSENhMTEyK3l5a0xXdG14bjAxb2JTMy85VmovQU1UdmZwNVRkUlhKNjF' + 'WcAo3L0N1L1pkQ3RDc1pyNnJpYVMxbUJGcmtTSkZJdmFjN2NNa3k2M0tVVXNaQmU5ZGFLdG1OMmhY' + 'TUt0VitESStvCjJFQVJNWlV5YTZIMzJXZUpzRGM0L1lscUR5TFAxYVR3NWNwRTJPY3dWQTdoQ1dCS' + 'ysyajIvZTl6RDhrYzM2R24KNG0wZWd3YWxlZ2UwTXFaUk1BbTFkenRpS3I1UWZ4MG9ZVUY3Z0JIYm' + 'RjM253cGZ6a3M2K1F4Tkl6V0hlRmN2WApxcXpsMGxnT2ZGeWc0VWptYzhFcTBiKy9ER3lYSGlHNXN' + 'vVmw1RGlVa1RKRjNrcURCZVVjZWNZaEx1VDd4emxzClk0bldYVFprc3lJMXVoZFJmS2NnbVZjQ0F3' + 'RUFBYU0xTURNd0RnWURWUjBQQVFIL0JBUURBZ1dnTUJNR0ExVWQKSlFRTU1Bb0dDQ3NHQVFVRkJ3T' + 'UNNQXdHQTFVZEV3RUIvd1FDTUFBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRy9rTElnQ2YwK2' + '1MZ1VXcWZjS2NLN0Nmdm9PbS9qL0FUSW1MR0YvSUtvQTRCWGhqMG5EcEszeVd3ZGt4d0hZCmxxUDh' + 'xZ1NyQ1FaNkVoSlpMSWtjQWovTUlTUEUvSlJPa3R5TWFTMis4OGhqeGpxdUhucnZ5ODA5ZlJ5QzhF' + 'R2kKeVIyRzhtNGJ5MEJrOWhENkVxbDYxb21VU0MzL2ozR3lPUGNZWDJEQjZsU2h4ZlFJVEpqUWNKQ' + '0oyMnNDdlBBOApVeU9EaUgrNllZSVdtVFN5a2kzazk0Q3NOZXlRbERjNzh3a1BseUdrN0p1anFIK2p' + 'KaURXSDQ2TXE3TTNaVVArCmowQWxhd3dtdllsRjBVZEIwdGRCenZWR21RbTRudEwwSkhVMGFqRnUy' + 'QTYvTjJmT3VrZWI0TDR6elBzSkJFNHIKaUUyNWRJUlAvWHRoM0tjRFYyYkxtMUk9Ci0tLS0tRU5EI' + 'ENFUlRJRklDQVRFLS0tLS0K') + old_key = ('LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMUROSElybmNBZC' + 's5V0RRMFV1MUVjSnJYWGI3TEtRdGEyYkdmVFdodExmLzFXUDhBCnhPOStubE4xRmNuclZXbnY4Szc5' + 'bDBLMEt4bXZxdUpwTFdZRVd1UklrVWk5cHp0d3lUTHJjcFJTeGtGNzExb3EKMlkzYUZjd3ExWDRNa' + 'jZqWVFCRXhsVEpyb2ZmWlo0bXdOemo5aVdvUElzL1ZwUERseWtUWTV6QlVEdUVKWUVyNwphUGI5Nz' + 'NNUHlSemZvYWZpYlI2REJxVjZCN1F5cGxFd0NiVjNPMklxdmxCL0hTaGhRWHVBRWR0MXplZkNsL09' + 'TCnpyNURFMGpOWWQ0Vnk5ZXFyT1hTV0E1OFhLRGhTT1p6d1NyUnY3OE1iSmNlSWJteWhXWGtPSlNS' + 'TWtYZVNvTUYKNVJ4NXhpRXU1UHZIT1d4amlkWmRObVN6SWpXNkYxRjhweUNaVndJREFRQUJBb0lCQ' + 'UNxbjNDYlk0YWJteVBNUQpHMnlJRVhmcFNGMnAyc0QzYlYzUlhNcDhzV1hMekJBRndxdlQwTW9XME' + 'xSK2tIWHRBN1NJR0tYdFhMWkZSWkMrClRwSTNyYXh2c3o2eE5wNkZUbGpEaVp6UXdBcm1ZdlNaUlg' + 'vU0NnTFR0ZENRdEFtMDBUT2Z3UzNTb3R3K0xFK3AKMStoaDVtVlhFby9XNDRWeWYxNjNsRHAwOXBD' + 'K3dpS0ZEa2JHVExBdnA1bnFaMnhtZDRyNzhyMi9TZmZ2YUplZQpJSlpwbENMYzMyQkVZaE4yeDRIa' + 'HpqQkhOdTJwYkFXS2twUDVjWkZNS3QwSUkrRTN0UUNWMlkrYVZvNTY0TzRGCjZxMmFUUzVxMnRuaW' + 'VBTS9uay8zN3hkNUVoNjRpMU8vQTU2YzdoZmxkMDVQMC9PdU9OY2dsaVVYRG44cnFvOUoKdXpFQ1F' + 'ORUNnWUVBN0xOeWRQQlhkdEZRZ3NrWG56UlVYM3hhYWFCYU8xYnJYZzVmUnlMVm5DY2thWlRORXlE' + 'dAp3eURxSGRUOGtRNXNIcXZ3WDNxNXR1elZBZ3NJUlhvcTZIUGtxRWdLeFZIclhTNzY1OFhLUnR1S' + 'GswbE11ZkQxCnVPVVBaTTJYNVR4NXRmTmh1Zlh3dXZqTkdyN0E3ZEw4VUFiY3ZtS2VuSnF2bDNJZX' + 'I0cVpkdDBDZ1lFQTVZQncKZ2pNTGJRZStEUzd1QmdsOFVmdGl5YnZCbDdTSEQ4T2RWamVOdzNEZjJ' + 'uckltQVdLTVhNTk5GWldwbmhhc0g3Swp1bWtMQWdMNWFEWXJhaFJHN2ZwMGd0YnN0RVE5Uit2dFVp' + 'azMxaFNHUS83dFBENU1LaU1jcFpnazhYUXI5UnlFCkVEN285bWFvUEZibnJKbFl5VXNQY0FCN3Y1W' + 'FNxaVdqeFZMODI4TUNnWUVBNUhoSk1DcVVvZkZqL3ZsUFBiSnIKQmtlbmxYRGI1NDc4WEtzT3VFRW' + 'RZajQ5M1ZOdHB0c1A1RnF1MytDbmNQUTAxRjR1QkZzWFMwUEtUdENMU1ZTawplZjd6WktNMUVrVUN' + 'JODJuRFhSU3pKWTFoS3NwemdpUmhjaERWWTlFNEZYQlBTa1EyVWhVOW9RVXBZNGQ5dkRCCjdoVFJt' + 'VXJqd2xGa3o0K3RvczdyVmxrQ2dZRUF4RW8vY0V5aVNDV29HblI2Sm5XMGZCWUxuMGxVUWlHb3B3W' + 'UQKS3Z1bTUzTkNNd1p6VFByb0FIVkw1T2kzZ2ZoTWNNcHhNRkNwbHBYZXBaQTNQNnFLSS83ajZnaF' + 'RPYmRueG56MgpaU0JWM21kOWt1aVdGY0dldVNlQTErMHlJOFhkMXU0RjBqTk1ZM3JZQjR1NDZQbmJ' + 'ZNGNzYy9vbDNXNFNXVzZLCkRUcDJoS3NDZ1lCSlpMQys3Uy9zRGVqdkl0MTZ2Q3JzbDJlWlFsb1p0' + 'clNoVCtTb0hmR1NPRXZkMXp1NStBL3UKaVVDYyt1SHdUa1c0RVpMTEdBYkUzTG1xSllJcXNkNVpUW' + 'UkxWTZ1TGoyV1NGWFZYUXVLanVlTDZJdGttc1dvZgpyMHFtQU93RHdFVDFvRXlNVUJoOTJVMmhxSHR' + 'aamlMdkxQdDc5aUhacDNtTnlLVjc5QXY3dVE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=') + + m.execute("sed -i '/client-certificate-data:/ s/:.*$/: %s/; /client-key-data:/ s/:.*$/: %s/' /home/admin/.kube/config" % ( + old_cert, old_key)) + m.execute("chown -R admin:admin /home/admin/.kube") + self.login_and_go("/kubernetes") + + b.wait_present(".curtains-ct") + b.wait_visible(".curtains-ct") + b.wait_in_text(".curtains-ct", "Couldn't connect to server") + b.wait_in_text(".curtains-ct", "Unauthorized") + b.wait_present(".curtains-ct #kubernetes-reconnect") + + # now provide a good certificate, and reconnect + m.upload([self.kubeconfig], "/home/admin/.kube/config") + m.execute("chown -R admin:admin /home/admin/.kube") + + b.click("#kubernetes-reconnect") + b.wait_present("#service-list") + + +@skipImage("Kubernetes not packaged", "debian-stable", "debian-testing", "ubuntu-1604", "ubuntu-stable", "fedora-i386") @skipImage("No cockpit-kubernetes packaged", "continuous-atomic", "fedora-atomic", "rhel-atomic") class TestRegistry(MachineCase): additional_machines = { @@ -325,6 +400,26 @@ class TestRegistry(MachineCase): self.browser.wait_timeout(120) + def setupDockerRegistry(self): + """Run a docker registry instance and populate it + + The OpenShift registry can pull image streams from localhost:5555 for + testing. + """ + # set up a docker registry with cert, as openshift registry expects https + self.openshift.execute("docker run -d -p 5555:5000 --name testreg " + "-v /openshift.local.config/master/:/certs " + "-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/master.server.crt " + "-e REGISTRY_HTTP_TLS_KEY=/certs/master.server.key " + "registry:2") + self.openshift.execute("while ! curl -s --connect-timeout 1 https://localhost:5555/; do sleep 1; done") + self.addCleanup(self.openshift.execute, "docker rm -f testreg") + + # populate it with some images + self.openshift.execute("docker tag registry:5000/marmalade/juggs:latest localhost:5555/juggs:latest; " + "docker tag registry:5000/marmalade/juggs:2.11 localhost:5555/juggs:2.11; " + "docker push localhost:5555/juggs") + def testImages(self): b = self.browser o = self.openshift @@ -358,7 +453,7 @@ class TestRegistry(MachineCase): b.click(".listing-ct-head li:last-child a") b.wait_present(".listing-ct-body .registry-image-layers") b.wait_visible(".listing-ct-body .registry-image-layers") - b.wait_in_text(".listing-ct-body .registry-image-layers", "ADD file:") + b.wait_in_text(".listing-ct-body .registry-image-layers", "KiB") # Add postgres into the stream output = o.execute("oc get imagestream --namespace=marmalade --template='{{.spec}}' busybee") @@ -668,7 +763,7 @@ class TestRegistry(MachineCase): b.wait_visible("#add_role .dropdown-menu") b.click("#add_role a[value='Admin']") b.click(".btn-primary") - self.assertEqual(b.text(".dialog-error"), "The member name contains invalid characters.") + b.wait_in_text(".dialog-error", "The member name contains invalid characters.") # but email-style user name should be accepted b.set_val("#add_member_name", "foo@bar.com") @@ -690,7 +785,7 @@ class TestRegistry(MachineCase): b.set_val("#user_name", "bar ^ baz") b.set_val("#identities", "anypassword:abc123") b.click(".btn-primary") - self.assertEqual(b.text(".dialog-error"), "The name contains invalid characters") + b.wait_in_text(".dialog-error", "The name contains invalid characters") # email-style user name should be accepted b.set_val("#user_name", "bar@baz.com") @@ -977,6 +1072,70 @@ class TestRegistry(MachineCase): # FIXME: known to fail for now, needs fixing in registry-image-widgets # b.wait_not_visible('.registry-imagestream-push') + def testImagestreamImport(self): + b = self.browser + self.setupDockerRegistry() + + # Add new "alltags" image stream pulling from localhost:5555/juggs + self.login_and_go("/kubernetes/registry#/images/marmalade") + b.wait_present("a.pull-right span:contains('New image stream')") + b.click("a.pull-right") + b.wait_present("modal-dialog") + b.wait_val("#imagestream-modify-project-text", "marmalade") + b.set_val("#imagestream-modify-name", "alltags") + b.wait_present("#imagestream-modify-populate") + b.click("#imagestream-modify-populate button") + b.wait_visible("#imagestream-modify-populate .dropdown-menu") + b.click("#imagestream-modify-populate .dropdown-menu a[value='pull']") + b.wait_present("#imagestream-modify-pull") + b.wait_visible("#imagestream-modify-pull") + b.set_val("#imagestream-modify-pull", "localhost:5555/juggs") + b.click("modal-dialog div.modal-footer button.btn-primary") + b.wait_not_present("modal-dialog") + + # new stream with both "latest" and "2.11" tags should now appear + b.wait_present("tr.imagestream-item th:contains('marmalade/alltags')") + b.wait_present('tbody[data-id="marmalade/alltags:latest"]') + b.wait_present('tbody[data-id="marmalade/alltags:2.11"]') + + # also check with CLI + output = self.openshift.execute("oc get imagestream --namespace=marmalade alltags") + self.assertIn("localhost:5555/juggs", output) + self.assertIn("latest", output) + self.assertIn("2.11", output) + + # Add new "sometags" image stream pulling only the 2.11 tag + b.click("a.pull-right") + b.wait_present("modal-dialog") + b.wait_val("#imagestream-modify-project-text", "marmalade") + b.set_val("#imagestream-modify-name", "sometags") + b.wait_present("#imagestream-modify-populate") + b.click("#imagestream-modify-populate button") + b.wait_visible("#imagestream-modify-populate .dropdown-menu") + b.click("#imagestream-modify-populate .dropdown-menu a[value='tags']") + b.wait_present("#imagestream-modify-tags") + b.wait_visible("#imagestream-modify-tags") + b.set_val("#imagestream-modify-pull", "localhost:5555/juggs") + # fields.tags is not an element, type manually + b.click("#imagestream-modify-tags") + b.key_press(['2', '.', '1', '1']) + b.click("modal-dialog div.modal-footer button.btn-primary") + b.wait_not_present("modal-dialog") + + # new stream with only "2.11" tags should now appear + b.wait_present("tr.imagestream-item th:contains('marmalade/sometags')") + b.go("/kubernetes/registry#/images/marmalade/sometags") + # EXFAIL: https://bugzilla.redhat.com/show_bug.cgi?id=1373332 + # b.wait_present('tbody[data-id="marmalade/sometags:2.11"]') + self.assertFalse(b.is_present('tbody[data-id="marmalade/sometags:latest"]')) + + # also check with CLI + output = self.openshift.execute("oc get imagestream --namespace=marmalade sometags") + self.assertIn("localhost:5555/juggs", output) + self.assertIn("2.11", output) + # EXFAIL: https://bugzilla.redhat.com/show_bug.cgi?id=1373332 + # self.assertNotIn("latest", output) + if __name__ == '__main__': test_main() diff --git a/test/verify/kubelib.py b/test/verify/kubelib.py index 1af2c44..5be8aed 100644 --- a/test/verify/kubelib.py +++ b/test/verify/kubelib.py @@ -47,6 +47,11 @@ class KubernetesCase(testlib.MachineCase): def start_kubernetes(self): self.machine.execute("systemctl start docker || journalctl -u docker") + + # HACK: work around https://github.com/kubernetes/kubernetes/issues/43805 until + # the fix lands in Fedora 26 + if self.machine.image == "fedora-26": + self.machine.execute("""sed -i '/KUBELET_ARGS=/ { s/"$/ --cgroup-driver=systemd"/ }' /etc/kubernetes/kubelet""") try: self.machine.execute('/etc/kubernetes/start-kubernetes') except subprocess.CalledProcessError: @@ -62,7 +67,9 @@ class KubernetesCase(testlib.MachineCase): scheme=%s for a in $(seq 0 $timeout); do if curl -o /dev/null -k -s $scheme://localhost:$port; then - break + if kubectl get all | grep -q svc/kubernetes; then + break + fi fi sleep 0.5 done -- 2.13.5