Exemple #1
0
def make_ucs():
    err, msg, handle = login()
    if err != 0:
        return not_logged_in(msg)
    #TODO: make so we can specify orgs in kubam. Right now its hard coded.
    err, msg = UCSUtil.create_org(handle, "kubam")
    if err != 0:
        logout(handle)
        return err, msg
    err, msg, net_settings = YamlDB.get_ucs_network(KUBAM_CFG)
    selected_vlan = ""
    if "vlan" in net_settings:
        selected_vlan = net_settings["vlan"]
    if selected_vlan == "":
        logout(handle)
        return 1, "No vlan selected in UCS configuration."
    err, msg = UCSNet.createKubeNetworking(handle, "org-root/org-kubam",
                                           selected_vlan)
    if err != 0:
        logout(handle)
        return err, msg

    # get the selected servers, and hosts.
    err, msg, hosts = YamlDB.get_hosts(KUBAM_CFG)
    err, msg, servers = YamlDB.get_ucs_servers(KUBAM_CFG)
    err, msg, kubam_ip = YamlDB.get_kubam_ip(KUBAM_CFG)
    err, msg = UCSServer.createKubeServers(handle, "org-root/org-kubam", hosts,
                                           servers, kubam_ip)
    if err != 0:
        logout(handle)
        return err, msg

    logout(handle)
    return err, msg
Exemple #2
0
def make_ucs():
    err, msg, handle = login()
    if err != 0: 
        return not_logged_in(msg) 
    err, msg, full_org = get_full_org(handle)
    if err != 0: 
        return err, msg
    
    err, msg, net_settings = YamlDB.get_ucs_network(KUBAM_CFG)
    selected_vlan = ""
    if "vlan" in net_settings:
        selected_vlan = net_settings["vlan"]
    if selected_vlan == "":
        logout(handle)
        return 1, "No vlan selected in UCS configuration."

    err, msg = UCSNet.createKubeNetworking(handle, full_org, selected_vlan)
    if err != 0:
        logout(handle)
        return err, msg

    # get the selected servers, and hosts.
    err, msg, hosts = YamlDB.get_hosts(KUBAM_CFG)
    err, msg, servers = YamlDB.get_ucs_servers(KUBAM_CFG)
    err, msg, kubam_ip = YamlDB.get_kubam_ip(KUBAM_CFG)
    
    err, msg = UCSServer.createKubeServers(handle, full_org, hosts, servers, kubam_ip)
    if err != 0:
        logout(handle)
        return err, msg
    
    logout(handle)
    return err, msg
Exemple #3
0
def get_servers():
    err, msg, handle = login()
    if err != 0:
        return not_logged_in(msg)
    servers = UCSServer.list_servers(handle)
    logout(handle)

    # gets a hash of severs of form:
    # {blades: ["1/1", "1/2",..], rack: ["6", "7"]}
    err, msg, dbServers = YamlDB.get_ucs_servers(KUBAM_CFG)
    if err != 0:
        return jsonify({'error': msg}), 400
    servers = servers_to_api(servers, dbServers)
    #app.logger.info("returninng servers...")
    #app.logger.info(servers)
    err, msg, hosts = YamlDB.get_hosts(KUBAM_CFG)
    if err != 0:
        return jsonify({'error': msg}), 400
    return jsonify({'servers': servers, 'hosts': hosts}), 200
Exemple #4
0
def get_servers(server_group):
    """
    List all the servers in the server group
    or in this case the domain. 
    1. Make call to UCS to grab the servers. 
    2. Make call to database to see which ones are selected.
    3. Call servers_to_api which merges the two adding 'selected: true' to the servers that are selected.
    """
    db = YamlDB()
    try:
        sg = db.get_server_group(Const.KUBAM_CFG, server_group)
    except KubamError as e:
        return jsonify({"error": str(e)}), Const.HTTP_BAD_REQUEST

    if sg['type'] == "ucsm":
        try:
            handle = UCSUtil.ucs_login(sg)
        except KubamError as e:
            return jsonify({"error": str(e)}), Const.HTTP_UNAUTHORIZED
        ucs_servers = UCSServer.list_servers(handle)
        UCSUtil.ucs_logout(handle)
    elif sg['type'] == 'ucsc':
        try:
            handle = UCSCUtil.ucsc_login(sg)
        except KubamError as e:
            return jsonify({"error": str(e)}), Const.HTTP_UNAUTHORIZED
        ucs_servers = UCSCServer.list_servers(handle)
        UCSCUtil.ucsc_logout(handle)

    # Gets a hash of severs of form:
    # {blades: ["1/1", "1/2",..], rack: ["6", "7"]}
    err, msg, db_servers = db.get_ucs_servers(Const.KUBAM_CFG, server_group)
    if err != 0:
        return jsonify({"error": msg}), Const.HTTP_BAD_REQUEST
    if db_servers is None:
        return jsonify({"servers": ucs_servers})

    ucs_servers = UCSUtil.servers_to_api(ucs_servers, db_servers)
    if err != 0:
        return jsonify({"error": msg}), Const.HTTP_BAD_REQUEST
    return jsonify({"servers": ucs_servers}), Const.HTTP_OK
Exemple #5
0
    def make_ucs():
        ucs_util = UCSUtil()
        try:
            handle = ucs_util.ucs_login()
        except KubamError as e:
            return 1, str(e)
        err, msg, full_org = ucs_util.get_full_org(handle)
        if err != 0:
            return err, msg

        db = YamlDB()
        err, msg, net_settings = db.get_ucs_network(Const.KUBAM_CFG)
        selected_vlan = ""
        if "vlan" in net_settings:
            selected_vlan = net_settings["vlan"]
        if selected_vlan == "":
            UCSUtil.ucs_logout(handle)
            return 1, "No VLAN selected in UCS configuration."

        ucs_net = UCSNet()
        err, msg = ucs_net.create_kube_networking(handle, full_org, selected_vlan)
        if err != 0:
            UCSUtil.ucs_logout(handle)
            return err, msg

        # Get the selected servers and hosts
        err, msg, hosts = db.get_hosts(Const.KUBAM_CFG)
        err, msg, servers = db.get_ucs_servers(Const.KUBAM_CFG)
        err, msg, kubam_ip = db.get_kubam_ip(Const.KUBAM_CFG)

        ucs_server = UCSServer()
        err, msg = ucs_server.create_server_resources(handle, full_org, hosts, servers, kubam_ip)
        if err != 0:
            UCSUtil.ucs_logout(handle)
            return err, msg

        UCSUtil.ucs_logout(handle)
        return err, msg
Exemple #6
0
 def test_get_ucs_servers(self):
     err, msg, servers = YamlDB.get_ucs_servers("/tmp/bfoo.yaml")
     assert (err == 0)
     assert ("blades" in servers)
Exemple #7
0
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)