def test_cluster_roles_admin(self): self.shell.run_cmdline('/Cluster/Minions add node1.ceph.com') self.clearSysOut() self.shell.run_cmdline('/Cluster/Roles/Admin add node1.ceph.com') self.assertInSysOut('1 minion added.') self.assertGrains('node1.ceph.com', 'ceph-salt', { 'member': True, 'roles': ['admin'], 'execution': {} }) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), ['node1']) self.assertEqual(PillarManager.get('ceph-salt:minions:mgr'), []) self.assertEqual(PillarManager.get('ceph-salt:minions:mon'), {}) self.assertEqual(PillarManager.get('ceph-salt:bootstrap_minion'), None) self.shell.run_cmdline('/Cluster/Roles/Admin rm node1.ceph.com') self.assertInSysOut('1 minion removed.') self.assertGrains('node1.ceph.com', 'ceph-salt', { 'member': True, 'roles': [], 'execution': {} }) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), []) self.assertEqual(PillarManager.get('ceph-salt:minions:mgr'), []) self.assertEqual(PillarManager.get('ceph-salt:minions:mon'), {}) self.assertEqual(PillarManager.get('ceph-salt:bootstrap_minion'), None) self.shell.run_cmdline('/Cluster/Minions rm node1.ceph.com')
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_import(self): self.fs.create_file('/config.json', contents=json.dumps({ 'minions': { 'all': ['node1.ceph.com', 'node2.ceph.com'], 'admin': ['node1.ceph.com'] }, 'time_server': { 'server_host': 'node1.ceph.com', 'subnet': '10.20.188.0/24' }})) self.assertTrue(run_import("/config.json")) self.assertInSysOut('Configuration imported.') self.assertGrains('node1.ceph.com', 'ceph-salt', {'member': True, 'roles': ['admin'], 'execution': {}}) self.assertGrains('node2.ceph.com', 'ceph-salt', {'member': True, 'roles': [], 'execution': {}}) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1.ceph.com', 'node2.ceph.com']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), ['node1.ceph.com']) self.assertIsNone(PillarManager.get('ceph-salt:bootstrap_minion')) self.assertEqual(PillarManager.get('ceph-salt:time_server:server_host'), 'node1.ceph.com') self.assertEqual(PillarManager.get('ceph-salt:time_server:subnet'), '10.20.188.0/24') self.shell.run_cmdline('/time_server/subnet reset') self.shell.run_cmdline('/time_server/server_hostname reset') self.shell.run_cmdline('/ceph_cluster/roles/admin remove node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/minions remove node2.ceph.com') self.shell.run_cmdline('/ceph_cluster/minions remove node1.ceph.com') self.fs.remove('/config.json')
def assertConfigOption(self, path, pillar_key): self.shell.run_cmdline('{} add section1'.format(path)) self.assertInSysOut('Section added.') sec_path = '{}/{}'.format(path, 'section1') sec_pillar_key = '{}:{}'.format(pillar_key, 'section1') self.shell.run_cmdline('{} set "my option1" 2'.format(sec_path)) self.assertInSysOut('Parameter set.') self.assertEqual(PillarManager.get(sec_pillar_key), {'my option1': '2'}) self.shell.run_cmdline('{} set "my option2" 3'.format(sec_path)) self.assertInSysOut('Parameter set.') self.assertEqual(PillarManager.get(sec_pillar_key), {'my option1': '2', 'my option2': '3'}) self.shell.run_cmdline('{} remove "my option1"'.format(sec_path)) self.assertInSysOut('Parameter removed.') self.assertEqual(PillarManager.get(sec_pillar_key), {'my option2': '3'}) self.shell.run_cmdline('{} reset'.format(sec_path)) self.assertInSysOut('Parameters reset.') self.assertEqual(PillarManager.get(sec_pillar_key), {}) self.shell.run_cmdline('{} reset'.format(path)) self.assertInSysOut('Config reset.') self.assertEqual(PillarManager.get(pillar_key), {})
def test_pillar_reset(self): PillarManager.set('ceph-salt:test', 'some text') val = PillarManager.get('ceph-salt:test') self.assertEqual(val, 'some text') PillarManager.reset('ceph-salt:test') val = PillarManager.get('ceph-salt:test') self.assertIsNone(val)
def assertDictOption(self, path, pillar_key, parameter, value): self.shell.run_cmdline('{} set "{}" "{}"'.format(path, parameter, value)) self.assertInSysOut('Parameter set.') self.assertEqual(PillarManager.get('{}:{}'.format(pillar_key, parameter)), value) self.shell.run_cmdline('{} remove {}'.format(path, parameter)) self.assertInSysOut('Parameter removed.') self.assertEqual(PillarManager.get('{}:{}'.format(pillar_key, parameter)), None)
def assertValueOption(self, path, pillar_key, value): self.shell.run_cmdline('{} set {}'.format(path, value)) self.assertInSysOut('Value set.') self.assertEqual(PillarManager.get(pillar_key), value) self.shell.run_cmdline('{} reset'.format(path)) self.assertInSysOut('Value reset.') self.assertEqual(PillarManager.get(pillar_key), None)
def assertListOption(self, path, pillar_key, values): for value in values: self.shell.run_cmdline('{} add {}'.format(path, value)) self.assertInSysOut('Value added.') self.assertEqual(PillarManager.get(pillar_key), values) for value in values: self.shell.run_cmdline('{} remove {}'.format(path, value)) self.assertInSysOut('Value removed.') self.assertEqual(PillarManager.get(pillar_key), [])
def assertFlagOption(self, path, pillar_key, reset_supported=True): self.shell.run_cmdline('{} enable'.format(path)) self.assertInSysOut('Enabled.') self.assertEqual(PillarManager.get(pillar_key), True) self.shell.run_cmdline('{} disable'.format(path)) self.assertInSysOut('Disabled.') self.assertEqual(PillarManager.get(pillar_key), False) if reset_supported: self.shell.run_cmdline('{} reset'.format(path)) self.assertInSysOut('Value reset.') self.assertEqual(PillarManager.get(pillar_key), None)
def assertImportOption(self, path, pillar_key, file_content): file_path = '/import.file' self.fs.create_file(file_path, contents=file_content) self.shell.run_cmdline('{} import {}'.format(path, file_path)) self.assertInSysOut('Value imported.') self.assertEqual(PillarManager.get(pillar_key), file_content) self.shell.run_cmdline('{} export'.format(path)) self.assertInSysOut(file_content) self.shell.run_cmdline('{} reset'.format(path)) self.assertInSysOut('Value reset.') self.assertEqual(PillarManager.get(pillar_key), None) self.fs.remove(file_path)
def test_cluster_minions_add_invalid_ip(self): fqdn_ip4 = GrainsManager.get_grain('node1.ceph.com', 'fqdn_ip4') GrainsManager.set_grain('node1.ceph.com', 'fqdn_ip4', ['127.0.0.1']) self.shell.run_cmdline('/Cluster/Minions add node1.ceph.com') self.assertInSysOut("Host 'node1.ceph.com' FQDN resolves to the loopback interface IP " "address") self.assertIsNone(PillarManager.get('ceph-salt:minions:all')) GrainsManager.set_grain('node1.ceph.com', 'fqdn_ip4', fqdn_ip4)
def assertValidateConfig(self, expected, deployed=False, ceph_nodes=None): if ceph_nodes is None: ceph_nodes = {} all = PillarManager.get('ceph-salt:minions:all', []) for i, minion_id in enumerate(all): ceph_node = CephNode(minion_id) # pylint: disable=protected-access ceph_node._ipsv4 = ['10.20.188.{}'.format(201 + i)] # pylint: disable=protected-access ceph_node._ipsv6 = ['fe80::5054:ff:fefc:{}'.format(1001 + i)] ceph_nodes[minion_id] = ceph_node self.assertEqual(validate_config(deployed, ceph_nodes), expected)
def test_cluster_minions_rm_with_role(self): self.shell.run_cmdline('/Cluster/Minions add node1.ceph.com') self.shell.run_cmdline('/Cluster/Roles/Mgr add node1.ceph.com') self.clearSysOut() self.shell.run_cmdline('/Cluster/Minions rm node1.ceph.com') self.assertInSysOut("Cannot remove host 'node1.ceph.com' because it has roles defined: " "{'mgr'}") self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1']) self.shell.run_cmdline('/Cluster/Roles/Mgr rm node1.ceph.com') self.shell.run_cmdline('/Cluster/Minions rm node1.ceph.com')
def test_ceph_cluster_roles_bootstrap(self): with pytest.raises(MinionDoesNotExistInConfiguration): self.shell.run_cmdline('/ceph_cluster/roles/bootstrap set node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/minions add node1.ceph.com') self.clearSysOut() self.shell.run_cmdline('/ceph_cluster/roles/bootstrap set node1.ceph.com') self.assertInSysOut('Value set.') self.assertGrains('node1.ceph.com', 'ceph-salt', {'member': True, 'roles': [], 'execution': {}}) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1.ceph.com']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), []) self.assertEqual(PillarManager.get('ceph-salt:bootstrap_minion'), 'node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/roles/bootstrap reset') self.assertInSysOut('Value reset.') self.assertGrains('node1.ceph.com', 'ceph-salt', {'member': True, 'roles': [], 'execution': {}}) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1.ceph.com']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), []) self.assertEqual(PillarManager.get('ceph-salt:bootstrap_minion'), None) self.shell.run_cmdline('/ceph_cluster/minions remove node1.ceph.com')
def test_export(self): self.shell.run_cmdline('/ceph_cluster/minions add node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/minions add node2.ceph.com') self.shell.run_cmdline( '/ceph_cluster/roles/cephadm add node1.ceph.com') self.shell.run_cmdline( '/ceph_cluster/roles/cephadm add node2.ceph.com') self.shell.run_cmdline('/ceph_cluster/roles/admin add node1.ceph.com') self.shell.run_cmdline( '/time_server/server_hostname set node1.ceph.com') self.shell.run_cmdline('/time_server/subnet set 10.20.188.0/24') self.clearSysOut() self.assertTrue(run_export(False)) self.assertJsonInSysOut({ 'container': { 'registries_enabled': True }, 'dashboard': { 'username': '******', 'password': PillarManager.get('ceph-salt:dashboard:password'), 'password_update_required': True }, 'minions': { 'all': ['node1.ceph.com', 'node2.ceph.com'], 'admin': ['node1.ceph.com'], 'cephadm': ['node1.ceph.com', 'node2.ceph.com'] }, 'ssh': { 'user': '******' }, 'time_server': { 'enabled': True, 'server_host': 'node1.ceph.com', 'subnet': '10.20.188.0/24' }, 'updates': { 'enabled': True, 'reboot': True } }) self.shell.run_cmdline('/time_server/subnet reset') self.shell.run_cmdline('/time_server/server_hostname reset') self.shell.run_cmdline( '/ceph_cluster/roles/admin remove node1.ceph.com') self.shell.run_cmdline( '/ceph_cluster/roles/cephadm remove node2.ceph.com') self.shell.run_cmdline( '/ceph_cluster/roles/cephadm remove node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/minions remove node2.ceph.com') self.shell.run_cmdline('/ceph_cluster/minions remove node1.ceph.com')
def test_ceph_cluster_minions_remove_with_roles(self): self.shell.run_cmdline('/ceph_cluster/minions add node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/roles/admin add node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/roles/bootstrap set node1.ceph.com') self.clearSysOut() self.shell.run_cmdline('/ceph_cluster/minions remove node1.ceph.com') self.assertInSysOut("Cannot remove host 'node1.ceph.com' because it has roles defined: " "['admin', 'bootstrap']") self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1.ceph.com']) self.shell.run_cmdline('/ceph_cluster/roles/admin remove node1.ceph.com') self.shell.run_cmdline('/ceph_cluster/roles/bootstrap reset') self.shell.run_cmdline('/ceph_cluster/minions remove node1.ceph.com')
def test_ceph_cluster_minions(self): self.shell.run_cmdline('/ceph_cluster/minions add node1.ceph.com') self.assertInSysOut('1 minion added.') self.assertGrains('node1.ceph.com', 'ceph-salt', {'member': True, 'roles': [], 'execution': {}}) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1.ceph.com']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), []) self.assertEqual(PillarManager.get('ceph-salt:bootstrap_minion'), None) self.shell.run_cmdline('/ceph_cluster/minions remove node1.ceph.com') self.assertInSysOut('1 minion removed.') self.assertNotInGrains('node1.ceph.com', 'ceph-salt') self.assertEqual(PillarManager.get('ceph-salt:minions:all'), []) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), []) self.assertEqual(PillarManager.get('ceph-salt:bootstrap_minion'), None)
def test_import(self): self.fs.create_file('/config.json', contents=json.dumps({ 'minions': { 'all': ['node1', 'node2'], 'admin': [], 'mgr': ['node1'], 'mon': { 'node2': '10.20.39.202' } }, 'time_server': { 'server_host': 'server1' } })) self.assertTrue(run_import("/config.json")) self.assertInSysOut('Configuration imported.') self.assertGrains('node1.ceph.com', 'ceph-salt', { 'member': True, 'roles': ['mgr'], 'execution': {} }) self.assertGrains('node2.ceph.com', 'ceph-salt', { 'member': True, 'roles': ['mon'], 'execution': {} }) self.assertEqual(PillarManager.get('ceph-salt:minions:all'), ['node1', 'node2']) self.assertEqual(PillarManager.get('ceph-salt:minions:admin'), []) self.assertEqual(PillarManager.get('ceph-salt:minions:mgr'), ['node1']) self.assertEqual(PillarManager.get('ceph-salt:minions:mon'), {'node2': '10.20.39.202'}) self.assertIsNone(PillarManager.get('ceph-salt:bootstrap_minion')) self.assertEqual( PillarManager.get('ceph-salt:time_server:server_host'), 'server1') self.shell.run_cmdline('/Time_Server/Server_Hostname reset') self.shell.run_cmdline('/Cluster/Roles/Mon rm node2.ceph.com') self.shell.run_cmdline('/Cluster/Roles/Mgr rm node1.ceph.com') self.shell.run_cmdline('/Cluster/Minions rm node2.ceph.com') self.shell.run_cmdline('/Cluster/Minions rm node1.ceph.com') self.fs.remove('/config.json')
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)