def test_ssh(self): self.shell.run_cmdline('/ssh generate') self.assertInSysOut('Key pair generated.') self.assertNotEqual(PillarManager.get('ceph-salt:ssh:private_key'), None) self.assertNotEqual(PillarManager.get('ceph-salt:ssh:public_key'), None)
def test_no_admin_minion(self): PillarManager.set('ceph-salt:minions:admin', []) self.assertValidateConfig("No admin minion specified in config")
def test_bootstrap_minion_is_not_cephadm(self): PillarManager.set('ceph-salt:minions:admin', ['node2.ceph.com']) PillarManager.set('ceph-salt:minions:cephadm', ['node2.ceph.com']) self.assertValidateConfig("Bootstrap minion must have 'cephadm' role") self.assertValidateConfig(None, deployed=True)
def test_latency_and_throughput_roles(self): PillarManager.set('ceph-salt:bootstrap_minion', 'node2.ceph.com') PillarManager.set('ceph-salt:bootstrap_mon_ip', '10.20.188.202') PillarManager.set('ceph-salt:minions:admin', ['node2.ceph.com']) PillarManager.set('ceph-salt:minions:cephadm', ['node2.ceph.com']) PillarManager.set('ceph-salt:minions:latency', ['node2.ceph.com']) PillarManager.set('ceph-salt:minions:throughput', ['node2.ceph.com']) self.assertValidateConfig("Minion 'node2.ceph.com' has both 'latency' " "and 'throughput' roles")
def test_no_ceph_container_image_path(self): PillarManager.reset('ceph-salt:container:images:ceph') self.assertValidateConfig( "No Ceph container image path specified in config")
def test_pillar_installed_top_without_base(self): self.fs.remove_object('/srv/pillar/ceph-salt.sls') self.fs.create_file('/srv/pillar/top.sls', contents='') self.assertFalse(PillarManager.pillar_installed()) self.fs.create_file('/srv/pillar/ceph-salt.sls') self.fs.remove_object('/srv/pillar/top.sls')
def test_cephadm_not_cluster_minion(self): PillarManager.set('ceph-salt:minions:cephadm', ['node1.ceph.com', 'node4.ceph.com']) self.assertValidateConfig("Minion 'node4.ceph.com' has 'cephadm' role " "but is not a cluster minion")
def test_no_bootstrap_mon_ip(self): PillarManager.reset('ceph-salt:bootstrap_mon_ip') self.assertEqual(validate_config([]), "No bootstrap Mon IP specified in config")
def test_loopback_bootstrap_mon_ip(self): PillarManager.set('ceph-salt:bootstrap_mon_ip', '127.0.0.1') self.assertEqual(validate_config([]), "Mon IP cannot be the loopback interface IP")
def test_no_bootstrap_minion(self): PillarManager.reset('ceph-salt:bootstrap_minion') self.assertEqual(validate_config([]), "No bootstrap minion specified in config") self.assertEqual(validate_config([{'hostname': 'node1'}]), None)
def test_bootstrap_minion_is_not_admin(self): PillarManager.set('ceph-salt:minions:admin', []) self.assertEqual(validate_config([]), "Bootstrap minion must be 'Admin'") self.assertEqual(validate_config([{'hostname': 'node1'}]), None)
def tearDown(self): super(ConfigShellTest, self).tearDown() PillarManager.reload()
def test_cephadm_bootstrap_dashboard_password(self): default = PillarManager.get('ceph-salt:dashboard:password') self.assertValueOption('/cephadm_bootstrap/dashboard/password', 'ceph-salt:dashboard:password', 'mypassword', default)
def tearDown(self): super(ConfigShellTest, self).tearDown() PillarManager.reload() for minion in self.salt_env.minions: self.fs.remove_object('{}/{}'.format(self.pki_minions_fs_path(), minion))
def test_pillar_installed_no_top2(self): self.assertFalse(PillarManager.pillar_installed())
def test_no_time_server_subnet(self): PillarManager.reset('ceph-salt:time_server:subnet') self.assertEqual(validate_config([]), "No time server subnet specified in config")
def tearDown(self): super(PillarManagerTest, self).tearDown() PillarManager.reload()
def test_no_external_time_servers(self): PillarManager.reset('ceph-salt:time_server:external_time_servers') self.assertEqual(validate_config([]), "No external time servers specified in config")
def test_pillar_install(self): self.fs.remove_object('/srv/pillar/ceph-salt.sls') self.assertFalse(PillarManager.pillar_installed()) PillarManager.install_pillar() self.assertTrue(PillarManager.pillar_installed())
def test_admin_not_cluster_minion(self): PillarManager.set('ceph-salt:bootstrap_minion', 'node3.ceph.com') PillarManager.set('ceph-salt:minions:admin', ['node3.ceph.com']) self.assertEqual(validate_config([]), "One or more Admin nodes are not cluster minions")
def tearDown(self): super(ValidateConfigTest, self).tearDown() PillarManager.reload()
def create_valid_config(cls): PillarManager.set('ceph-salt:bootstrap_minion', 'node1.ceph.com') PillarManager.set('ceph-salt:bootstrap_mon_ip', '10.20.188.201') PillarManager.set('ceph-salt:time_server:enabled', True) PillarManager.set('ceph-salt:time_server:server_host', 'node1.ceph.com') PillarManager.set('ceph-salt:time_server:external_time_servers', ['pool.ntp.org']) PillarManager.set('ceph-salt:time_server:subnet', '10.20.188.0/24') PillarManager.set('ceph-salt:minions:all', ['node1.ceph.com', 'node2.ceph.com']) PillarManager.set('ceph-salt:minions:admin', ['node1.ceph.com']) PillarManager.set('ceph-salt:container:images:ceph', 'docker.io/ceph/daemon-base:latest')
def test_no_bootstrap_minion(self): PillarManager.reset('ceph-salt:bootstrap_minion') self.assertValidateConfig("No bootstrap minion specified in config") self.assertValidateConfig(None, deployed=True)
def test_pillar_install3(self): self.fs.remove_object('/srv/pillar/ceph-salt.sls') self.fs.create_file('/srv/pillar/top.sls', contents='') self.assertFalse(PillarManager.pillar_installed()) PillarManager.install_pillar() self.assertTrue(PillarManager.pillar_installed())
def test_ceph_container_image_relative_path(self): PillarManager.set('ceph-salt:container:images:ceph', 'ceph/ceph:v15.2.2') self.assertValidateConfig( "A relative image path was given, but only absolute image " "paths are supported")
def test_pillar_get(self): PillarManager.set('ceph-salt:test', 'some text') val = PillarManager.get('ceph-salt:test') self.assertEqual(val, 'some text')
def create_valid_config(cls): PillarManager.set('ceph-salt:dashboard:username', 'admin1') PillarManager.set('ceph-salt:dashboard:password', 'admin2') PillarManager.set('ceph-salt:dashboard:password_update_required', True) PillarManager.set( 'ceph-salt:dashboard:ssl_certificate', """-----BEGIN CERTIFICATE----- MIIDNTCCAh2gAwIBAgIUNBWaDwDpsU7OWD1iNVDu9576ORgwDQYJKoZIhvcNAQEL BQAwKjELMAkGA1UECgwCSVQxGzAZBgNVBAMMEmNlcGgtbWdyLWRhc2hib2FyZDAe Fw0yMDA1MjYxNDIwMTZaFw0zMDA1MjQxNDIwMTZaMCoxCzAJBgNVBAoMAklUMRsw GQYDVQQDDBJjZXBoLW1nci1kYXNoYm9hcmQwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQCz1rqRFF4cu6by4a3bpxdt9nmAtf8yOhhUPs5dv5APvqg6E5o2 Uv5n+pR8gRpyBjVfUqEM6BAvXrLuVjXbiaJkRzbhR9YTpsVmLft6RyzyqxP9q3EN W7QCSGwfOJJjdZ9M0iEvrAJ2C66dpDoTI65ewJYgW77COyglhj8FruiXi5q+W25V +EbZ4aoOqbwiXyTRodPgL42WnKXSloTa1ojzKFMgaUZWjwswX6pf4qGhuIZZVuvx P+7lpsag84mF1oZhijiKTJ9/gCmmyhEr3ZZEKxCsIXXQiVFdimbSxLXQBE9iX2EU s1b+4iRxCsf5y7VW734svxyj++a8p4jquHc3AgMBAAGjUzBRMB0GA1UdDgQWBBSy +awnKYIkZJnTuE65jKimjSGQGjAfBgNVHSMEGDAWgBSy+awnKYIkZJnTuE65jKim jSGQGjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAf0wm2vNLy 1O97iFT0ZERnOY8U3LNebZwq2I0luSlrr02gWYK/m5CdQw1EHxERjuuuOOVDazGp 20qHJczzNowySjF1vU7wc2fzK89RQpXXlmLYl/eaH5bVCdyQ6yC/Mpka65LAqnVi XseHg+sXSkWPftmajz2wIAsP2V1b4D3M5dR1+s6ksWLtABkoVZHW726J6wc9Cc8Q r1BG2ZGm3Br8nfeaIY3M1A/tRTj+Y44ab1ZaFIr8sT8VwH1/TPfms1NzoydwGEkc vmDVPjWIAnF9dV6HJ8kHOcndZyemx2yxFUI1f1DNchRxn9UO1FOITCbeX/mz8TAr ZYUvxW5OQp8g -----END CERTIFICATE-----""") PillarManager.set( 'ceph-salt:dashboard:ssl_certificate_key', """-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCz1rqRFF4cu6by 4a3bpxdt9nmAtf8yOhhUPs5dv5APvqg6E5o2Uv5n+pR8gRpyBjVfUqEM6BAvXrLu VjXbiaJkRzbhR9YTpsVmLft6RyzyqxP9q3ENW7QCSGwfOJJjdZ9M0iEvrAJ2C66d pDoTI65ewJYgW77COyglhj8FruiXi5q+W25V+EbZ4aoOqbwiXyTRodPgL42WnKXS loTa1ojzKFMgaUZWjwswX6pf4qGhuIZZVuvxP+7lpsag84mF1oZhijiKTJ9/gCmm yhEr3ZZEKxCsIXXQiVFdimbSxLXQBE9iX2EUs1b+4iRxCsf5y7VW734svxyj++a8 p4jquHc3AgMBAAECggEBAKstsAYaWf6Fi8LSl7dlU8LiggLGuXNoovHFmo7XoVur QduN/xLIaso0VRQxmyd/y1vBffSYC5fbTvvX6Ynfd0h2FMHYq+emrWy2RhG9IAaY Wv3xKzno2O33W5tYMNclBY2M0fPbibgtJHd+85x2MSqVrBB+45Nj1bHqF6DkPRbJ PCoYVC11K3TOzf+x9ihOxBmvWEUnNuIjwvWoMK9KfhbiMYqIPwg3VIbrrXeebzJB hs4wYssHnLK85LVmPXzgUODLqCR9oaaVh+BdkEepEGB/dh7fylMY8Za6IZ098Cy3 JQiVfwixRQuKg0ViyFMsgI6mZFIpbVPmps/4XZtdukECgYEA67LI0/08IHh3sFDZ eYb5Yva01Kw1/Lwi1MgUSc9aeYU7vJcagVARiTcNtkWUqGIZ3uSOdcOpFSfhLntL BC8gr7btpxiKmhVHme+dxs1lc8AEEwm5N6u6gS92rQxCnAW1/7s2eFGvGu43G4k7 /JpFeGV20+CJhLO4uexJQdsflOECgYEAw1Q5fMvCY1jMiq+kqXB0m3ZPjNcKwa3c Uvhdebl7QirauO55zMaLDBhNlu7CaXGmhVixENyGZCpkrUSquqrTtQTRxjsqcS4g yDFQIWyiXOg2T9YmAJU7EalrFyK6EimmA8hj62ZWwEdIkZNBtvcN5iBetGHxtdd3 nWEF2rzd9xcCgYAvgjgM0ux9twqZFZLgdh5qnkPQ4m13Zgy3SyUbw5n/CKYD24lS K2t9dwViih/u2OdSEEvO3QOF6iXvkpaKX119TagVmFLHwCZQlwX8foZGkJvBoqIc 4JaVV5XaR7BddqE6zOer1PswuHePK1hWEFqUbA9JoebWQsunXkNd7OcuwQKBgEyf xLF1CTuJwSuCfZjOeZ/myIwaa6jQuEaAEcNHhNfPEeBMBNHU7QUAn6de4DsXD1ju Ev/nUn0GuFnUPxldHBG940DdQugFTWzbE3EZOZQyr+OfwWanI/XovQ7lW5L2bZ68 RJ46ljt1ez1IRBYvUm99MUmXxocsEEtXnUFSp8xfAoGAVr/QnNlwNoLY8LTKgfG1 BJGDcEjQZ0KwFnaPfCMTXwnWaMHfGA9k7VrDZwxpTfGQ0b2cl+tCk7by/SCmDW6k RpDBiJHfMFDSRysZrjmuULRJvcrItRg2r3TIVuB8Wxze7Ugyb9G4hH7ZIW1y9QlG SCzirUzUKN2oge2WieNI7MQ= -----END PRIVATE KEY-----""") PillarManager.set('ceph-salt:bootstrap_minion', 'node1.ceph.com') PillarManager.set('ceph-salt:bootstrap_mon_ip', '10.20.188.201') PillarManager.set('ceph-salt:time_server:enabled', True) PillarManager.set('ceph-salt:time_server:server_hosts', ['node1.ceph.com']) PillarManager.set('ceph-salt:time_server:external_time_servers', ['pool.ntp.org']) PillarManager.set('ceph-salt:time_server:subnet', '10.20.188.0/24') PillarManager.set( 'ceph-salt:minions:all', ['node1.ceph.com', 'node2.ceph.com', 'node3.ceph.com']) PillarManager.set('ceph-salt:minions:cephadm', ['node1.ceph.com', 'node2.ceph.com']) PillarManager.set('ceph-salt:minions:admin', ['node1.ceph.com']) PillarManager.set('ceph-salt:container:registries_enabled', True) PillarManager.set('ceph-salt:container:registries', [{ 'insecure': True, 'location': "172.17.0.1:5000/docker.io", 'prefix': "docker.io" }, { 'insecure': False, 'location': "172.17.0.2:5000/docker2.io", 'prefix': "docker2.io" }]) PillarManager.set('ceph-salt:container:images:ceph', 'docker.io/ceph/daemon-base:latest') PillarManager.set( 'ceph-salt:ssh:public_key', """ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ\ ClF4wYDBN6wC9Amp4xouZTDbOqZdkXxUezgbFrG1Nd+YtK7rF3sMdcE7ypKWkxwq3a/ZdWxnlAgQaCq2onXVo02/HhXrkaOf\ fH2GKzhEIw6sW0FnZ+y6XpBh6nvlD87mD8mrQbnhsjFjX+odS8gmNJOZOBxHdeWy86PHUesjttAUYwi42fWB6LkJrz74nbkp\ ueqi4w3EjuV3zSsQoAnVkCNO1ShlQYi1LeMB9EmejaGXBugAC+XsK0hn2kabRTa3ido6BbCXJDH+dkFnBKkiGQZY1Gl7+lJZ\ PkBcJB7nz233ba8bgrT0uSSu3fyWnnobKjnuas9lakvRedwKIy8LjZ""") PillarManager.set( 'ceph-salt:ssh:private_key', """-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEApReMGAwTesAvQJqeMaLmUw2zqmXZF8VHs4GxaxtTXfmLSu6x d7DHXBO8qSlpMcKt2v2XVsZ5QIEGgqtqJ11aNNvx4V65Gjn3x9his4RCMOrFtBZ2 fsul6QYep75Q/O5g/Jq0G54bIxY1/qHUvIJjSTmTgcR3XlsvOjx1HrI7bQFGMIuN n1gei5Ca8++J25KbnqouMNxI7ld80rEKAJ1ZAjTtUoZUGItS3jAfRJno2hlwboAA vl7CtIZ9pGm0U2t4naOgWwlyQx/nZBZwSpIhkGWNRpe/pSWT5AXCQe589t922vG4 K09Lkkrt38lp56Gyo57mrPZWpL0XncCiMvC42QIDAQABAoIBACnvVEebcatBe/82 By7miQjZtyR2YHGYTAE91Vo2g7OgOpCbFvsnLUynOsnhWfYo1E6HEdUZ7xzCaWvx rLI5FTvODp/Hls8hoF3kChY9Zy7Tw8pd1lWY1xjc1BaZ0iqdRoeDqHJHc+8yqh52 7vm/SQcFmAFjbUrLcLCjQMC+Vzf1rRfOfoTM9snkuBcd0eOjvivGAQSeF4S6FPlV XjuVPMqkXYxzVv+AUbMzwr4iPcDUJ09qx+w/S2f/h7SBgt9Jsq4dvYtQfKwS2XSP QSE0cK7tCjVE1t0sh/2+j1ppl8LHiYS3fIeLAkCnnm9jhVPddtgImp9GlL+qx70Y 40DDbn0CgYEAvSKahj8hswDnH433jf8NQEcjcb3CHqfUjmZrG/qLi1uMsaUp7ICU wMc6MCgGcMFsC11g2PvGIvwaACBIpjWM/7cGxnomYWYeOjluhQdb1PB+KYX5mSPL RRYq0kSNiJeqUFGj+9xfoVFGfpYIdtCUqUy9eGVyhYTLH0vxJz91l3sCgYEA33Tz YG0Xj/1zvFPO+GD+cn5Sm4AEpiYxVuk7EGj1jEPVtA9l+nUUpbBV0U92a+pzuX/f q0n7Zy+THAC0Q6qdzsKHcy6vPeHECF49G29qXxaQ3sHop8316rAqu7BpdL4xn9XT Qp7g/1ivrzMWRZpt/BtEnBe7XMUZLZNzPJ0LlrsCgYEAoyiu1RCxKZKlz3rRDBXy gHjeAskIJRnzK8T+sWw55UZc4QLyX6usp4E2mURuCedSJZuwaH8KNjP02hb/lSKt OAvUNHQ7l9pYSTIyPWBTwCaXL4r7/zf5quesmSe6URNFQXSsWiGJ/cf3YExdkOHu 3P3ulWYunTApah5BMvJzpvECgYEAgIeEdbJKG0htiaWrJrKjqLeATHEWO3s8ZgFB N+8nTca25Rr2TVmKxsLmmb5bHzd72Pb0cFHdiTyUIUdGaKV6n7LEtjvkEHQLjcSm 4WD0jj0slvRyHhMZoCQ0cEDIZ53+bTFQksFQKY+ZfeykouRw3tHQZPhBjNrR4KUv Y23xfIECgYBDFQLNOS7Tz0+TGZaAOce7oRV5HWyW+AFrpyxavw+YbE3s37IDvcdU EwiXg1NW1KlU9Q2bjWRXJ0tPQO+EyRQ0pn7yXA53xhBxVYW4T4KAqK6AFsiJQncf +x5J3qK6+KAfo07TBNG1aIBQfY346EaUc20aRHFfnad9EF4KAmgszA== -----END RSA PRIVATE KEY-----""")
def test_pillar_installed_no_top(self): self.fs.remove_object('/srv/pillar/ceph-salt.sls') self.assertFalse(PillarManager.pillar_installed()) self.fs.create_file('/srv/pillar/ceph-salt.sls')
def test_ssh_no_private_key(self): PillarManager.reset('ceph-salt:ssh:private_key') self.assertValidateConfig("No SSH private key specified in config")
def test_updates_reboot_not_set(self): PillarManager.reset('ceph-salt:updates:reboot') self.assertEqual(validate_config([]), "'ceph-salt:updates:reboot' must be of type Boolean")