From 422959ed18aa870ecc8c64ad6f43a3dc5dcdd80c Mon Sep 17 00:00:00 2001
From: Dominik Perpeet <dperpeet@redhat.com>
Date: Tue, 20 Jun 2017 22:35:41 +0200
Subject: [PATCH 13/16] test: Update openshift tests to master
Closes #7025
Reviewed-by: Stef Walter <stefw@redhat.com>
---
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..3aebb52 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 member 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 <input> 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.9.4