|
Packit Service |
eebd6f |
#!/usr/bin/python3
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# checkpoint:
|
|
Packit Service |
eebd6f |
# 1. export blueprint package list (copy)
|
|
Packit Service |
eebd6f |
# 2. blueprint description edit/update
|
|
Packit Service |
eebd6f |
# 3. hostname setting
|
|
Packit Service |
eebd6f |
# 4. user setting
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
import crypt
|
|
Packit Service |
eebd6f |
import re
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
import composerlib
|
|
Packit Service |
eebd6f |
import testlib
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
@testlib.nondestructive
|
|
Packit Service |
eebd6f |
class TestCustom(composerlib.ComposerCase):
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
def testExport(self):
|
|
Packit Service |
eebd6f |
b = self.browser
|
|
Packit Service |
eebd6f |
m = self.machine
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
0c2606 |
self.login_and_go("/composer", superuser=True)
|
|
Packit Service |
eebd6f |
b.wait_present("#main")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# go to blueprint openssh-server
|
|
Packit Service |
eebd6f |
b.click("#openssh-server-name")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# export package list
|
|
Packit Service |
eebd6f |
actions_drop_down_sel = ".cmpsr-header__actions #dropdownKebab"
|
|
Packit Service |
eebd6f |
with b.wait_timeout(300):
|
|
Packit Service |
eebd6f |
b.click(actions_drop_down_sel)
|
|
Packit Service |
eebd6f |
b.wait_attr(actions_drop_down_sel, "aria-expanded", "true")
|
|
Packit Service |
eebd6f |
b.click("a:contains('Export')")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-export")
|
|
Packit Service |
eebd6f |
with b.wait_timeout(300):
|
|
Packit Service |
eebd6f |
b.wait_in_text("#textInput2-modal-markup", "openssh-server")
|
|
Packit Service |
eebd6f |
packages_list = b.text("#textInput2-modal-markup")
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-export button[data-btn=copy-export]")
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-export button[data-btn=close-export]")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-export")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
list_from_backend = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints depsolve openssh-server | tail -n +2
|
|
Packit Service |
eebd6f |
""").split()
|
|
Packit Service |
eebd6f |
# remove tailing ".x86_64" or ".noarch"(6 chars) or ".aarch64"(7 chars)
|
|
Packit Service |
eebd6f |
# and "*:" in libpcap-14:1.9.1-2.fc31.x86_64
|
|
Packit Service |
eebd6f |
regex = re.compile("-[0-9]*:")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
def remove(x):
|
|
Packit Service |
eebd6f |
if x.endswith("aarch64"):
|
|
Packit Service |
eebd6f |
return regex.sub("-", x[:-8])
|
|
Packit Service |
eebd6f |
else:
|
|
Packit Service |
eebd6f |
return regex.sub("-", x[:-7])
|
|
Packit Service |
eebd6f |
format_list = map(remove, list_from_backend)
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
self.assertEqual(packages_list, "\n".join(format_list))
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# collect code coverage result
|
|
Packit Service |
eebd6f |
self.check_coverage()
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
def testDescription(self):
|
|
Packit Service |
eebd6f |
b = self.browser
|
|
Packit Service |
eebd6f |
m = self.machine
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
0c2606 |
self.login_and_go("/composer", superuser=True)
|
|
Packit Service |
eebd6f |
b.wait_present("#main")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# go to blueprint openssh-server
|
|
Packit Service |
eebd6f |
b.click("#openssh-server-name")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# update description (cancel first)
|
|
Packit Service |
eebd6f |
updated_description = "edit ssh server image description"
|
|
Packit Service |
eebd6f |
with b.wait_timeout(300):
|
|
Packit Service |
eebd6f |
b.click("a:contains('ssh server image')")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-edit-description")
|
|
Packit Service |
eebd6f |
b.set_input_text("#textInput-modal-markup", updated_description)
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-edit-description button:contains('Cancel')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-edit-description")
|
|
Packit Service |
eebd6f |
b.wait_present("a:contains('ssh server image')")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# update description
|
|
Packit Service |
eebd6f |
actions_drop_down_sel = ".cmpsr-header__actions #dropdownKebab"
|
|
Packit Service |
eebd6f |
b.click(actions_drop_down_sel)
|
|
Packit Service |
eebd6f |
b.wait_attr(actions_drop_down_sel, "aria-expanded", "true")
|
|
Packit Service |
eebd6f |
b.click("a:contains('Edit description')")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-edit-description")
|
|
Packit Service |
eebd6f |
b.set_input_text("#textInput-modal-markup", updated_description)
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-edit-description button:contains('Save')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-edit-description")
|
|
Packit Service |
eebd6f |
b.wait_present("a:contains('{}')".format(updated_description))
|
|
Packit Service |
eebd6f |
# backend got updated as well
|
|
Packit Service |
eebd6f |
desc = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep description | \
|
|
Packit Service |
eebd6f |
awk -F '"' '{print $2}'
|
|
Packit Service |
eebd6f |
""").rstrip()
|
|
Packit Service |
eebd6f |
self.assertEqual(desc, updated_description)
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# collect code coverage result
|
|
Packit Service |
eebd6f |
self.check_coverage()
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
def testHostname(self):
|
|
Packit Service |
eebd6f |
b = self.browser
|
|
Packit Service |
eebd6f |
m = self.machine
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
0c2606 |
self.login_and_go("/composer", superuser=True)
|
|
Packit Service |
eebd6f |
b.wait_present("#main")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
b.click("#openssh-server-name")
|
|
Packit Service |
eebd6f |
with b.wait_timeout(300):
|
|
Packit Service |
eebd6f |
b.click("#blueprint-tabs-tab-customizations")
|
|
Packit Service |
eebd6f |
# set hostname to "openssh-server"
|
|
Packit Service |
eebd6f |
b.click("button[aria-describedby=Hostname-help2]")
|
|
Packit Service |
eebd6f |
b.set_input_text("input[aria-label=Hostname]", "hostname-openssh-server")
|
|
Packit Service |
eebd6f |
b.click(".form-control-pf-save")
|
|
Packit Service |
eebd6f |
b.wait_present("span:contains(hostname-openssh-server)")
|
|
Packit Service |
eebd6f |
hostname = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep hostname | awk -F '"' '{print $2}'
|
|
Packit Service |
eebd6f |
""").rstrip()
|
|
Packit Service |
eebd6f |
b.wait_present("span:contains({})".format(hostname))
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# update hostname
|
|
Packit Service |
eebd6f |
b.click(".form-control-pf-value")
|
|
Packit Service |
eebd6f |
b.set_input_text("input[aria-label=Hostname]", "update-openssh-server")
|
|
Packit Service |
eebd6f |
b.key_press("\r")
|
|
Packit Service |
eebd6f |
b.wait_present("span:contains(update-openssh-server)")
|
|
Packit Service |
eebd6f |
hostname = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep hostname | awk -F '"' '{print $2}'
|
|
Packit Service |
eebd6f |
""").rstrip()
|
|
Packit Service |
eebd6f |
b.wait_present("span:contains({})".format(hostname))
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# clicking x button will not update
|
|
Packit Service |
eebd6f |
b.click(".form-control-pf-value")
|
|
Packit Service |
eebd6f |
b.set_input_text("input[aria-label=Hostname]", "no-update-openssh-server")
|
|
Packit Service |
eebd6f |
b.click(".form-control-pf-cancel")
|
|
Packit Service |
eebd6f |
b.wait_present("span:contains(update-openssh-server)")
|
|
Packit Service |
eebd6f |
hostname = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep hostname | awk -F '"' '{print $2}'
|
|
Packit Service |
eebd6f |
""").rstrip()
|
|
Packit Service |
eebd6f |
b.wait_present("span:contains({})".format(hostname))
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# invalid character, save button is disabled
|
|
Packit Service |
eebd6f |
b.click(".form-control-pf-value")
|
|
Packit Service |
eebd6f |
b.set_input_text("input[aria-label=Hostname]", "?")
|
|
Packit Service |
eebd6f |
b.wait_attr(".form-control-pf-save", "disabled", "")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# collect code coverage result
|
|
Packit Service |
eebd6f |
self.check_coverage()
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
def testUserAccount(self):
|
|
Packit Service |
eebd6f |
b = self.browser
|
|
Packit Service |
eebd6f |
m = self.machine
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# HACK: cockpit-composer may loose keystrokes, see issue #944
|
|
Packit Service |
eebd6f |
def set_input_value(sel, val):
|
|
Packit Service |
eebd6f |
w = ""
|
|
Packit Service |
eebd6f |
for k in val:
|
|
Packit Service |
eebd6f |
w += k
|
|
Packit Service |
eebd6f |
while b.val(sel) != w:
|
|
Packit Service |
eebd6f |
b.focus(sel)
|
|
Packit Service |
eebd6f |
b.key_press(k)
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
0c2606 |
self.login_and_go("/composer", superuser=True)
|
|
Packit Service |
eebd6f |
b.wait_present("#main")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
b.click("#openssh-server-name")
|
|
Packit Service |
eebd6f |
with b.wait_timeout(300):
|
|
Packit Service |
eebd6f |
b.click("#blueprint-tabs-tab-customizations")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# add a new user
|
|
Packit Service |
eebd6f |
b.click("button:contains('Create User Account')")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput2-modal-user", "x y")
|
|
Packit Service |
eebd6f |
b.wait_val("#textInput1-modal-user", "xy")
|
|
Packit Service |
eebd6f |
b.click("input[type=checkbox]")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput1-modal-password", "fooBAR!@#123")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput2-modal-password", "fooBAR!@#123")
|
|
Packit Service |
eebd6f |
ssh_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUOtNJdBEXyKxBB898rdT54ULjMGuO6v4" \
|
|
Packit Service |
eebd6f |
"jLXmRsdRhR5Id/lKNc9hsdioPWUePgYlqML2iSV72vKQoVhkyYkpcsjr3zvBny9+5xej3+T" \
|
|
Packit Service |
eebd6f |
"BLoEMAm2hmllKPmxYJDU8jQJ7wJuRrOVOnk0iSNF+FcY/yaQ0owSF02Nphx47j2KWc0IjGG" \
|
|
Packit Service |
eebd6f |
"lt4fl0fmHJuZBA2afN/4IYIIsEWZziDewVtaEjWV3InMRLllfdqGMllhFR+ed2hQz9PN2Qc" \
|
|
Packit Service |
eebd6f |
"apmEvUR4UCy/mJXrke5htyFyHi8ECfyMMyYeHwbWLFQIve4CWix9qtksvKjcetnxT+WWrut" \
|
|
Packit Service |
eebd6f |
"dr3c9cfIj/c0v/Zg/c4zETxtp cockpit-test"
|
|
Packit Service |
eebd6f |
b.set_input_text("#textInput5-modal-user", ssh_key)
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-user-account button:contains('Create')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
b.wait_text("tr td[data-label='Full name']", "x y")
|
|
Packit Service |
eebd6f |
b.wait_text("tr td[data-label='User name']", "xy")
|
|
Packit Service |
eebd6f |
b.wait_present("tr td[data-label='Server administrator'] .fa-check")
|
|
Packit Service |
eebd6f |
b.wait_present("tr td[data-label=Password] .fa-check")
|
|
Packit Service |
eebd6f |
b.wait_in_text("tr td[data-label='SSH key']", "cockpit-test")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# check backend to have correct password configured
|
|
Packit Service |
eebd6f |
passwd_str = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep password | awk -F '"' '{print $2}'
|
|
Packit Service |
eebd6f |
""").rstrip()
|
|
Packit Service |
eebd6f |
salt = passwd_str[:passwd_str.rfind("$")]
|
|
Packit Service |
eebd6f |
passwd_crypt = crypt.crypt("fooBAR!@#123", salt)
|
|
Packit Service |
eebd6f |
self.assertEqual(passwd_str, passwd_crypt)
|
|
Packit Service |
eebd6f |
# check backend to have correct ssh key configured
|
|
Packit Service |
eebd6f |
ssh_key_backend = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep key | awk -F '"' '{print $2}'
|
|
Packit Service |
eebd6f |
""").rstrip()
|
|
Packit Service |
eebd6f |
self.assertEqual(ssh_key_backend, ssh_key)
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# update password
|
|
Packit Service |
eebd6f |
new_password = "c456rty$%^RTY"
|
|
Packit Service |
eebd6f |
b.click("button[aria-label='Edit User Account xy']")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
b.click("button:contains('Set New Password')")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput1-modal-password", new_password)
|
|
Packit Service |
eebd6f |
set_input_value("#textInput2-modal-password", new_password)
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-user-account button:contains('Update')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
b.wait_present("tr td[data-label=Password] .fa-check")
|
|
Packit Service |
eebd6f |
passwd_str = m.execute("""
|
|
Packit Service |
eebd6f |
composer-cli blueprints show openssh-server | grep password | awk '{print $3}'
|
|
Packit Service |
eebd6f |
""").strip('"\n')
|
|
Packit Service |
eebd6f |
salt = passwd_str[:passwd_str.rfind("$")]
|
|
Packit Service |
eebd6f |
passwd_crypt = crypt.crypt(new_password, salt)
|
|
Packit Service |
eebd6f |
self.assertEqual(passwd_str, passwd_crypt)
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# remove password
|
|
Packit Service |
eebd6f |
b.click("button[aria-label='Edit User Account xy']")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
b.click("button:contains('Remove Password')")
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-user-account button:contains('Update')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
b.wait_present("tr td[data-label=Password]")
|
|
Packit Service |
eebd6f |
b.wait_not_present("tr td[data-label=Password] .fa-check")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# duplicated user
|
|
Packit Service |
eebd6f |
b.click("button:contains('Create User Account')")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput2-modal-user", "x y")
|
|
Packit Service |
eebd6f |
b.wait_val("#textInput1-modal-user", "xy")
|
|
Packit Service |
eebd6f |
b.wait_in_text("#textInput1-modal-user-help1", "This user name already exists.")
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-user-account button:contains('Cancel')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# password checking error
|
|
Packit Service |
eebd6f |
b.click("button:contains('Create User Account')")
|
|
Packit Service |
eebd6f |
b.wait_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput2-modal-user", "admin user")
|
|
Packit Service |
eebd6f |
b.wait_val("#textInput1-modal-user", "auser")
|
|
Packit Service |
eebd6f |
b.click("input[type=checkbox]")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput1-modal-password", "aaa")
|
|
Packit Service |
eebd6f |
set_input_value("#textInput2-modal-password", "bbb")
|
|
Packit Service |
eebd6f |
b.wait_in_text("#textInput2-modal-password-help",
|
|
Packit Service |
eebd6f |
"The values entered for password do not match.")
|
|
Packit Service |
eebd6f |
b.click("#cmpsr-modal-user-account .close")
|
|
Packit Service |
eebd6f |
b.wait_not_present("#cmpsr-modal-user-account")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# delete user
|
|
Packit Service |
eebd6f |
delete_drop_down_sel = "button[aria-label='User Account Actions xy']"
|
|
Packit Service |
eebd6f |
b.click(delete_drop_down_sel)
|
|
Packit Service |
eebd6f |
b.wait_attr(delete_drop_down_sel, "aria-expanded", "true")
|
|
Packit Service |
eebd6f |
b.click("a:contains('Delete User Account')")
|
|
Packit Service |
eebd6f |
b.wait_not_present("table")
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
# collect code coverage result
|
|
Packit Service |
eebd6f |
self.check_coverage()
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
|
|
Packit Service |
eebd6f |
if __name__ == '__main__':
|
|
Packit Service |
eebd6f |
testlib.test_main()
|