def get_valid_isos(os_list): valid_os = [] db = YamlDB() err, msg, iso_map = db.get_iso_map(Const.KUBAM_CFG) if err != 0: return 1, msg, None if iso_map == None: return 1, "Please upload ISO Images first", None for i in os_list: valid_iso = [x for x in iso_map if x["os"] == i] if not i in [x["os"] for x in iso_map]: return 1, "Please map {0} to an iso image".format(i), None valid_os.append(valid_iso[0]) return 0, None, valid_os
def mkboot_iso(): # get the iso map err, msg, isos = YamlDB.get_iso_map(KUBAM_CFG) if err != 0: return jsonify({"error": msg}), 400 if len(isos) == 0: return jsonify({"error": "No ISOS have been mapped. Please map an ISO image with an OS"}), 400 err, msg = IsoMaker.mkboot_iso(isos) if err != 0: return jsonify({"error": msg}), 400 err, msg = Builder.deploy_server_images(KUBAM_CFG) if err != 0: return jsonify({"error": msg}), 400 return jsonify({"status": "ok"}), 201
def mkboot_iso(): # Get the ISO map db = YamlDB() err, msg, iso_images = db.get_iso_map(Const.KUBAM_CFG) if err != 0: return jsonify({"error": msg}), 400 if len(iso_images) == 0: return jsonify({ "error": "No ISOS have been mapped. Please map an ISO image with an OS" }), 400 iso_maker = IsoMaker() err, msg = iso_maker.mkboot_iso(isos) if err != 0: return jsonify({"error": msg}), 400 builder = Builder() err, msg = builder.deploy_server_images(Const.KUBAM_CFG) if err != 0: return jsonify({"error": msg}), 400 return jsonify({"status": "ok"}), 201
def get_iso_map(): db = YamlDB() err, msg, iso_images = db.get_iso_map(Const.KUBAM_CFG) if err != 0: return jsonify({'error': msg}), 400 return jsonify({'iso_map': iso_images}), 200
def test_get_iso_map(self): err, msg, isos = YamlDB.get_iso_map("/tmp/bfoo.yaml") assert (err == 0)
def get_iso_map(): err, msg, isos = YamlDB.get_iso_map(KUBAM_CFG) if err != 0: return jsonify({'error': msg}), 400 return jsonify({'iso_map': isos}), 200
class DBUnitTests(unittest.TestCase): """Tests for `Autoinstall.py`.""" cfg = { "hosts": [{ "ip": "1.2.3.4", "name": "foonode", "role": "k8s master", "os": "esxi6.0" }, { "ip": "1.2.3.5", "name": "foonode2", "roe": "", "os": "esxi6.0" }], "network_groups": [{ "netmask": "255.255.254.0", "gateway": "192.28.3.4", "nameserver": "172.34.38.1", "ntpserver": "ntp.esl.cisco.com" }], "kubam_ip": "24.2.2.1" } bad1 = {"foo": "bar"} bad_node = {"name": "badname", "os": "bados", "ip": "20"} def __init__(self, *args, **kwargs): super(DBUnitTests, self).__init__(*args, **kwargs) self.db = YamlDB() def test_validate_os(self): err, msg = self.db.validate_os("bad") # assert(msg != "") # assert(err == 1) def test_validate_ip(self): err, msg = self.db.validate_ip("192.168.3.4.5") assert(msg != "") assert(err == 1) err, msg = self.db.validate_ip("192.168.3.4") assert(err == 0) def test_validate_hosts(self): err, msg = self.db.validate_hosts(self.cfg['hosts']) assert(err == 0) def test_validate_network(self): err, msg = self.db.validate_network(self.cfg['network_groups'][0]) assert(err == 0) def test_validate_config(self): err, msg, config = self.db.validate_config(self.cfg, True) assert(err == 0) err, msg, config = self.db.validate_config(self.bad1, True) assert(err != 0) def test_write_config(self): err, msg = self.db.write_config(self.cfg, "/tmp/foo.yaml") assert(err == 0) err, msg, config = self.db.open_config("/tmp/blah.yaml") assert(err == 2) err, msg, config = self.db.open_config("/tmp/foo.yaml") assert(err == 0) def test_get_network(self): err, msg, network = self.db.get_network("/tmp/bfoo.yaml") assert(err == 0) def test_update_network(self): err, msg = self.db.update_network( "/tmp/bfoo.yaml", { "nameserver": "192.168.3.1", "netmask": "255.255.255.0", "gateway": "192.168.1.1", "ntpserver": "ntp.cisco.com" } ) assert(err == 0) # make sure that it doesn"t let non-valid network configuration through. err, msg = self.db.update_network("/tmp/bfoo.yaml", {"netmask": "255.255.255.0", "gateway": "blah"}) assert(err > 0) def test_get_hosts(self): err, msg, hosts = self.db.get_hosts("/tmp/bfoo.yaml") assert(err == 0) def test_update_hosts(self): err, msg = self.db.update_hosts("/tmp/bfoo.yaml", self.cfg["hosts"]) assert(err == 0) def test_get_public_keys(self): err, msg, keys = self.db.get_public_keys("/tmp/bfoo.yaml") assert(err == 0) def test_get_kubam_ip(self): err, msg, keys = self.db.get_kubam_ip("/tmp/bfoo.yaml") assert(err == 0) def test_update_kubam_ip(self): err, msg = self.db.update_kubam_ip("/tmp/bfoo.yaml", "192.168.30.4") assert(err == 0) def test_get_proxy(self): err, msg, keys = self.db.get_proxy("/tmp/bfoo.yaml") assert(err == 0) def test_update_proxy(self): err, msg = self.db.update_proxy("/tmp/bfoo.yaml", "https://proxy.esl.cisco.com:80") assert(err == 0) def test_update_pks(self): err, msg = self.db.update_public_keys( "/tmp/bfoo.yaml", [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeV4/Sy+B8R21pKzODfGn5W/p9MC9/4ejFUJo" "I3RlobYOWWxbLmnHYbKmRHn8Jgpmm4xqv61uaFpbAZvxFTyKIqLdcYmxaHem35uzCJbgB8BvT+4" "aGg1pZREunX6YaE8+s3hFZRu4ti7UHQYWRD1tCizYz78YHL8snp+N3UAPmP9eTTNw62PHAJERi1" "Hbl6sRfYijqNlluO223Thqbmhtt3S8tnjkRsFnNxsDgxrfbR3GBQ5925hPth3lGejln2P1L9EIQ" "w9NOmtMhF9UpXPWP9r234p3crmBTsw+E6IF0+OsGKOl8Ri4Im7GpnAgbY9I5THEDn142uNOm6vJ" "ATZZ3 root@devi-builder" ] ) assert(err == 0) def test_show_config(self): err, msg, config = self.db.show_config("/tmp/bfoo.yaml") assert(err == 0) def test_get_iso_map(self): err, msg, isos = self.db.get_iso_map("/tmp/bfoo.yaml") assert(err == 0) def test_update_iso_map(self): err, msg = self.db.update_iso_map( "/tmp/bfoo.yaml", [ { "os": "centos7.3", "file": "/Users/vallard/Downloads/kubam/CentOS-7-x86_64-Minimal-1611.iso" }, { "os": "esxi6.0", "file": "/Users/vallard/Downloads/kubam/Vmware-ESXi-6.0.0-5050593-Custom-Cisco-6.0.3.2.iso" } ] ) assert(err == 1) def test_get_org(self): err, msg, keys = self.db.get_org("/tmp/bfoo.yaml") assert(err == 0) def test_update_org(self): err, msg = self.db.update_org("/tmp/bfoo.yaml", "kubam") assert(err == 0) def test_uuid(self): uuid = self.db.new_uuid() assert(str(uuid)) def test_server_group(self): test_file = "/tmp/k_test" if os.path.isfile(test_file): os.remove(test_file) err, msg = self.db.new_server_group("", "") assert(err == 1) # Pass something without a name err, msg = self.db.new_server_group("", {}) assert(err == 1) err, msg = self.db.new_server_group("", {"type": "beatlejuice"}) assert(err == 1) # No name passed, should generate error err, msg = self.db.new_server_group("", {"type": "imc"}) assert(err == 1) err, msg = self.db.new_server_group(test_file, {"type": "ucsm", "name": "blackbeard"}) assert(err == 1) err, msg = self.db.new_server_group(test_file, {"type": "ucsm", "name": "blackbeard", "credentials": "foo"}) assert(err == 1) err, msg = self.db.new_server_group(test_file, {"type": "ucsm", "name": "blackbeard", "credentials": {}}) assert(err == 1) err, msg = self.db.new_server_group( test_file, {"type": "ucsm", "name": "blackbeard", "credentials": {"user": "******"}} ) assert(err == 1) err, msg = self.db.new_server_group( test_file, {"type": "ucsm", "name": "blackbeard", "credentials": {"user": "******", "password": "******"}} ) assert(err == 1) # Add a new one, this should work as all the credentials are entered in err, msg = self.db.new_server_group(test_file, { "type": "ucsm", "name": "blackbeard", "credentials": { "user": "******", "password": "******", "ip": "123.34.23.2" } }) assert(err == 0) # This should fail because it has the same name as the other one. Names need to be unique err, msg = self.db.new_server_group(test_file, { "type": "ucsm", "name": "blackbeard", "credentials": { "user": "******", "password": "******", "ip": "123.34.23.2" } }) assert(err == 1) err, msg, sg = self.db.list_server_group(test_file) assert(err == 0) print sg assert(len(sg) == 1) # Change it fg = sg[0] # Do a copy so we have the object and can manipulate it bad_group = sg[0].copy() bad_group['id'] = "Ilovepeanutbuttersandwiches" fg['name'] = "new name" # Make sure if we try to update something that does not exist, it fails err, msg = self.db.update_server_group(test_file, bad_group) assert(err == 1) err, msg = self.db.update_server_group(test_file, fg) assert(err == 0) # see that we can get them if there are none. err, msg, servers = self.db.get_ucs_servers(test_file, fg['name']) assert(err == 0) # see that we can add new blades to the group err, msg = self.db.update_ucs_servers( test_file, {"blades": ["1/1", "1/2"], "rack_servers": ["7", "8", "9"]}, fg['name'] ) assert(err == 0) # make sure we actually got new servers err, msg, servers = self.db.get_ucs_servers(test_file, fg['name']) assert(err == 0) assert("blades" in servers) err, msg = self.db.delete_server_group(test_file, fg['name']) assert(err == 0) def test_decoderkey(self): file_name = "/tmp/kubam.yaml" err, msg, key = self.db.get_decoder_key(file_name) assert(err == 0) def test_aci(self): test_file = "/tmp/k_test" if os.path.isfile(test_file): os.remove(test_file) err, msg = self.db.new_aci("", "") assert(err == 1) # Pass something without a name err, msg = self.db.new_aci("", {}) assert(err == 1) err, msg = self.db.new_aci("", {"name": "aci01"}) assert(err == 1) err, msg = self.db.new_aci("", {"name": "aci01", }) assert(err == 1) err, msg = self.db.new_aci(test_file, {"name": "aci01", "credentials": "foo"}) assert(err == 1) err, msg = self.db.new_aci(test_file, {"name": "aci01", "credentials": "foo"}) assert(err == 1) err, msg = self.db.new_aci(test_file, {"name": "aci01", "credentials": {"ip": "foo"}}) assert(err == 1) err, msg = self.db.new_aci(test_file, {"name": "aci01", "credentials": {"ip": "foo", "user": "******"}}) assert(err == 1) err, msg = self.db.new_aci( test_file, {"name": "aci01", "credentials": {"ip": "foo", "user": "******", "password": "******"}} ) assert(err == 1) err, msg = self.db.new_aci(test_file, { "name": "aci01", "credentials": { "ip": "foo", "user": "******", "password": "******" }, "tenant_name": "blue" }) assert(err == 1) err, msg = self.db.new_aci(test_file, { "name": "aci01", "credentials": { "ip": "foo", "user": "******", "password": "******" }, "tenant_name": "blue", "vrf_name": "lagoon" }) assert(err == 1) err, msg = self.db.new_aci(test_file, { "name": "aci01", "credentials": { "ip": "foo", "user": "******", "password": "******" }, "tenant_name": "blue", "vrf_name": "lagoon", "bridge_domain": "3"}) assert(err == 0) err, msg, sg = self.db.list_aci(test_file) assert(err == 0) assert(len(sg) == 1) # Change it fg = sg[0] # Do a copy so we have the object and can manipulate it bad_group = sg[0].copy() bad_group['id'] = "Ilovepeanutbuttersandwiches" fg['name'] = "new name" # Make sure if we try to update something that does not exist, it fails err, msg = self.db.update_aci(test_file, bad_group) assert(err == 1) err, msg = self.db.update_aci(test_file, fg) assert(err == 0) err, msg = self.db.delete_aci(test_file, fg['id']) assert(err == 0) def test_network_group(self): test_file = "/tmp/k_test" if os.path.isfile(test_file): os.remove(test_file) err, msg = self.db.new_network_group("", "") assert(err == 1) # Pass something without a name err, msg = self.db.new_network_group("", {}) assert(err == 1) err, msg = self.db.new_network_group("", {"name": "net01"}) assert(err == 1) err, msg = self.db.new_network_group("", {"name": "net01", }) assert(err == 1) err, msg = self.db.new_network_group(test_file, {"name": "net01", "netmask": "foo"}) assert(err == 1) err, msg = self.db.new_network_group( test_file, {"name": "net01", "netmask": "255.255.255.0", "gateway": "192.168.1.1"} ) assert(err == 1) err, msg = self.db.new_network_group(test_file, { "name": "net01", "netmask": "255.255.255.0", "gateway": "192.168.1.1", "nameserver": "8.8.8.8" }) assert(err == 1) err, msg = self.db.new_network_group(test_file, { "name": "net01", "netmask": "255.255.255.0", "gateway": "192.168.1.1", "nameserver": "8.8.8.8", "ntpserver": "ntp.esl.cisco.com" }) assert(err == 0) err, msg, sg = self.db.list_network_group(test_file) assert(err == 0) assert(len(sg) == 1) # Change it fg = sg[0] # Do a copy so we have the object and can manipulate it. bad_group = sg[0].copy() bad_group['id'] = "Ilovepeanutbuttersandwiches" fg['name'] = "new name" # Make sure if we try to update something that does not exist, it fails err, msg = self.db.update_network_group(test_file, bad_group) assert(err == 1) err, msg = self.db.update_network_group(test_file, fg) assert(err == 0) err, msg = self.db.delete_network_group(test_file, fg['id']) assert(err == 0) def test_hosts(self): test_file = "/tmp/k_test" if os.path.isfile(test_file): os.remove(test_file) # First create a network to test with. err, msg = self.db.new_network_group(test_file, { "name": "net01", "netmask": "255.255.255.0", "gateway": "192.168.1.1", "nameserver": "8.8.8.8", "ntpserver": "ntp.esl.cisco.com" }) assert(err == 0) err, msg, nets = self.db.list_network_group(test_file) assert(err == 0) assert(len(nets) == 1) net = nets[0] net_id = net['id'] net_name = net['name'] err, msg = self.db.new_hosts("", "") assert(err == 1) # Pass something without a name err, msg = self.db.new_hosts("", {}) assert(err == 1) err, msg = self.db.new_hosts("", []) assert(err == 1) err, msg = self.db.new_hosts(test_file, [{"ip": "172.20.30.1"}]) assert(err == 1) err, msg = self.db.new_hosts(test_file, [{"name": "kube01", "ip": "172.20.30.1"}]) assert(err == 1) err, msg = self.db.new_hosts(test_file, [{"name": "kube01", "ip": "172.20.30.1", "os": "centos7.4"}]) assert(err == 1) err, msg = self.db.new_hosts( test_file, [{"name": "kube01", "ip": "172.20.30.1", "os": "centos7.4", "role": "generic"}] ) assert(err == 1) err, msg = self.db.new_hosts( test_file, [{"name": "kube01", "ip": "172.20.30.1.1", "os": "centos7.4", "role": "generic"}] ) assert(err == 1) err, msg = self.db.new_hosts( test_file, [{"name": "kube01 am", "ip": "172.20.30.1", "os": "centos7.4", "role": "generic"}] ) print ("hostnames should not have spaces in them") assert(err == 1) err, msg = self.db.new_hosts(test_file, [ {"name": "kube01", "ip": "172.20.30.1", "os": "centos7.4", "role": "generic"}, {"name": "kube01", "ip": "172.20.30.2", "os": "centos7.4", "role": "generic"} ]) print ("names should be unique") assert(err == 1) err, msg = self.db.new_hosts(test_file, [ {"name": "kube01", "ip": "172.20.30.1", "os": "centos7.4", "role": "generic"}, {"name": "kube02", "ip": "172.20.30.1", "os": "centos7.4", "role": "generic"} ]) print ("ip addreses should be unique") assert(err == 1) err, msg = self.db.new_hosts(test_file, [ {"name": "kube01", "ip": "172.20.30.1", "os": "centos7.8", "role": "generic"}, {"name": "kube02", "ip": "172.20.30.2", "os": "centos7.4", "role": "generic"} ]) print ("OS should be a supported type") assert(err == 1) good_array = [ {"name": "kube01", "ip": "172.20.30.1", "os": "centos7.4", "role": "generic", "network_group": net_name}, {"name": "kube02", "ip": "172.20.30.2", "os": "centos7.4", "role": "k8s master", "network_group": net_name} ] err, msg = self.db.new_hosts(test_file, good_array) print ("network should always have a network_group associated") assert (err == 0) err, msg = self.db.delete_network_group(test_file, net_id) assert(err == 0)