In [15]:
from pyparsing import Word, alphas, nums, alphanums, Suppress, OneOrMore, Group, ZeroOrMore, Literal

# create table overlay (directed False, multi_edge False)
overlay = Word(alphas +  "_")("overlay")
category = (Literal("nodes")("nodes") ^ Literal("edges")("edges") ^ Literal("ports")("ports"))
overlay_with_category = (overlay + Suppress(".") + category)

lbrack = Suppress("(")
rbrack = Suppress(")")
sqoute = Suppress("'")

#TODO: look for quoted
#TODO: define comma suppressed literal


create_overlay = (Suppress("CREATE OVERLAY") + overlay)("create_overlay")

value = Word(alphanums + "_" + "-" + ".")
node_keys = Group(value + ZeroOrMore(Suppress(",") + value))("keys")
node_values = Group(sqoute + value + sqoute + ZeroOrMore(Suppress(",") + sqoute + value + sqoute))("values")

insert_node = (Suppress("INSERT INTO") + overlay + Suppress(".") + Suppress("nodes") + lbrack 
               + node_keys + rbrack +  "VALUES" + lbrack + node_values + rbrack)("query")



#####

def fn_insert_edge(strg, loc, toks):
    data = toks.asDict()
    # data.get("query").get("values")
    src = data.get("src")
    dst = data.get("dst")
    overlay = data.get("overlay")
    return {"action": "insert_edge", "overlay": overlay,
                "src": src, "dst": dst}
    

edge_keys = Suppress("src, dst") # TODO: later allow insert by ports too
edge_values = sqoute + value("src") + sqoute + Suppress(",") + sqoute + value("dst") + sqoute
insert_edge = (Suppress("INSERT INTO") + overlay + Suppress(".") + Suppress("edges") 
               + lbrack + edge_keys + rbrack +  "VALUES" + lbrack + edge_values.setResultsName("values") + rbrack)("query").setParseAction(fn_insert_edge)

where_or_set_element = Group(value.setResultsName("key") + Suppress("=") + value.setResultsName("value"))
where_clause = Group(where_or_set_element + ZeroOrMore(Suppress("AND") + where_or_set_element))("where")

set_clause = Group(where_or_set_element + ZeroOrMore(Suppress(",") + where_or_set_element))("set")


def fn_delete_edge(strg, loc, toks):
    data = toks.asDict()
    print "keys", data.keys()
    print data.get("where")
    overlay = data.get("overlay")
    where = data.get("where")
    querystring = {x.get("key"): x.get("value") for x in where}
    print querystring
    #TODO: extract out src, dst, rest of the query string
    return {"action": "delete_edge", "overlay": overlay, "query": querystring}

def fn_update_edge(strg, loc, toks):
    data = toks.asDict()
    overlay = data.get("overlay")
    where = data.get("where")
    querystring = {x.get("key"): x.get("value") for x in where}
    set_clause = data.get("set")
    setstring = {x.get("key"): x.get("value") for x in set_clause}
    #TODO: extract out src, dst, rest of the query string
    return {"action": "update_edge", "overlay": overlay, "query": querystring, "set": setstring}

       
#TODO: also allow edge sets composed of node queries
# TODO: allow the parser to be used inside ANK as well (from Python)
delete_edge = (Suppress("DELETE FROM") + overlay + Suppress(".") + Suppress("edges") 
               + "WHERE" + lbrack + where_clause + rbrack)("query").setParseAction(fn_delete_edge)

update_edge = (Suppress("UPDATE") + overlay + Suppress(".") + Suppress("edges") 
               + "SET" + set_clause
               + "WHERE" + lbrack + where_clause + rbrack)("query").setParseAction(fn_update_edge)


query = (create_overlay ^ insert_node ^ insert_edge ^ delete_edge ^ update_edge)

queries = [
           #"CREATE OVERLAY ospf",
           #"CREATE OVERLAY ospf_live",
          #  "INSERT INTO ospf.nodes (id) VALUES ('a', 'b');",
           #"INSERT INTO ospf.nodes (id) VALUES ('1');",
            #"INSERT INTO ospf.nodes (id, asn, area) VALUES ('1','2','3');"
            #"INSERT INTO ospf.nodes (id) VALUES ('1');",
          "DELETE FROM ospf.edges WHERE (src=iosv-7) ;",
          "UPDATE ospf.edges SET abc=123,def=456 WHERE (src=iosv-7) ;",

            "INSERT INTO ospf.edges (src, dst) VALUES ('iosv-6', 'iosv-7');",
            #"DELETE FROM ospf.edges WHERE (type=physical) ;",

           ]

# set results parse action

results = []
for q in queries:
    import pprint
    result = query.parseString(q).asDict()
    #pprint.pprint(result)
    print
    print result
    results.append(result)


keys ['query', 'where', 'overlay']
[['src', 'iosv-7']]
{'src': 'iosv-7'}

{'query': {'action': 'delete_edge', 'query': {'src': 'iosv-7'}, 'overlay': 'ospf'}}
keys ['query', 'set', 'where', 'overlay']
[['src', 'iosv-7']]

{'query': {'action': 'update_edge', 'query': {'src': 'iosv-7'}, 'set': {'abc': '123', 'def': '456'}, 'overlay': 'ospf'}}

{'query': {'action': 'insert_edge', 'src': 'iosv-6', 'dst': 'iosv-7', 'overlay': 'ospf'}}

In [6]:
for result in results:
    
    query_type = result['query']['action']
    if query_type == "delete_edge":
        print result
        overlay = result['query']['overlay']
        g_overlay = anm[overlay]
        query = result['query']['query']
        print query
        src = query.get("src")
        dst = query.get("dst")
        try:
            del query['src']
        except KeyError:
            pass

        try:
            del query['dst']
        except KeyError:
            pass
        
        print src
        #TODO: remove this once allow direct string query of edges src_bunch and dst_bunch
    
        src_nbunch = None
        try:
            src_node = g_in.node(src)
            if src_node:
                src_nbunch = [src_node]
        except:
            pass

        dst_nbunch = None
        try:
            dst_node = g_in.node(dst)
            if dst_node:
                dst_nbunch = [dst_node]
        except:
            pass

        print dst_nbunch

        edges = g_overlay.edges(src_nbunch = src_nbunch, dst_nbunch=dst_nbunch, **query)
        if len(edges):
            print result
            g_overlay.remove_edges_from(edges)

    elif query_type == "insert_edge":
        overlay = result['query']['overlay']
        g_overlay = anm[overlay]

        src = result['query']['src']
        dst = result['query']['dst']
        src_node = g_overlay.node(src)
        dst_node = g_overlay.node(dst)
        print src_node, dst_node
        print g_overlay
        
        g_overlay.add_edge(src_node, dst_node)    
        print g_overlay.edges()
        print len(g_overlay.edges())






    import autonetkit
    autonetkit.update_vis(anm)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-6-f56ffaad3843> in <module>()
      5         print result
      6         overlay = result['query']['overlay']
----> 7         g_overlay = anm[overlay]
      8         query = result['query']['query']
      9         print query

NameError: name 'anm' is not defined
{'query': {'action': 'delete_edge', 'query': {'src': 'iosv-7'}, 'overlay': 'ospf'}}

In [195]:
print g_in.edges()


[input: (iosxrv-1, iosv-7), input: (iosxrv-1, iosv-3), input: (iosxrv-1, nx-osv-1), input: (iosxrv-1, iosxrv-2), input: (server-1, nx-osv-2), input: (server-1, csr1000v-1), input: (iosv-6, iosv-1), input: (iosv-6, iosv-4), input: (iosv-6, iosxrv-2), input: (csr1000v-1, nx-osv-1), input: (csr1000v-1, iosxrv-2), input: (iosv-2, iosv-5), input: (iosv-2, iosv-7), input: (iosv-2, iosv-3), input: (iosv-8, iosv-5), input: (iosv-8, iosv-3), input: (iosv-8, iosv-4), input: (iosxrv-2, iosv-1), input: (nx-osv-1, nx-osv-2), input: (iosv-4, iosv-3), input: (iosv-3, iosv-1)]

In [1]:
from autonetkit_cisco.wsgi_client import get_virl_to_anm

simulation_id = "Sample_Topologies@multiplatform-CQM4Jf"

server = "ank-dev"
auth_data = {
    'server': server,
    'username': "guest",
    'password': "guest",
   'sim_id': simulation_id,
}

anm = get_virl_to_anm(**auth_data)

from autonetkit.build_network import apply_design_rules
apply_design_rules(anm)


import autonetkit
autonetkit.update_vis(anm)


INFO Getting VIRL as ANM
INFO:ANK:Getting VIRL as ANM
INFO Getting VIRL file
INFO:ANK:Getting VIRL file
INFO Returning VIRL file
INFO:ANK:Returning VIRL file
INFO Converting graph input to undirected
INFO:ANK:Converting graph input to undirected
INFO Returning VIRL as ANM
INFO:ANK:Returning VIRL as ANM
INFO Building overlay topologies
INFO:ANK:Building overlay topologies
INFO Building layer2
INFO:ANK:Building layer2
INFO Building layer3
INFO:ANK:Building layer3
INFO Allocating IP addresses
INFO:ANK:Allocating IP addresses
INFO IPv4 allocations: Infrastructure: 10.0.0.0/8, Loopback: 192.168.0.0/16
INFO:ANK:IPv4 allocations: Infrastructure: 10.0.0.0/8, Loopback: 192.168.0.0/16
INFO Using specified IPv4 infrastructure allocation
INFO:ANK:Using specified IPv4 infrastructure allocation
INFO Building IGP
INFO:ANK:Building IGP
INFO Building BGP
INFO:ANK:Building BGP
INFO Building eBGP
INFO:ANK:Building eBGP
INFO Building iBGP
INFO:ANK:Building iBGP
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosxrv-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosxrv-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-6), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-6), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, csr1000v-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, csr1000v-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-2), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-2), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-8), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-8), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosxrv-2), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosxrv-2), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-7), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-7), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-4), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-4), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-3), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-3), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-5), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-5), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, nx-osv-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, nx-osv-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, nx-osv-2), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, nx-osv-2), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (server-1, iosv-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-6, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-6, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-7, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-7, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (csr1000v-1, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (csr1000v-1, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-2, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-2, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-8, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-8, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosxrv-2, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosxrv-2, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosxrv-1, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosxrv-1, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (nx-osv-1, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (nx-osv-1, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-4, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-4, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-5, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-5, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-3, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-3, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (nx-osv-2, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (nx-osv-2, server-1), src/dst not in overlay
WARNING [Overlay: ibgp_v4]: Not adding edge bgp: (iosv-1, server-1), src/dst not in overlay
WARNING:ANK:[Overlay: ibgp_v4]: Not adding edge bgp: (iosv-1, server-1), src/dst not in overlay
INFO Finished building network
INFO:ANK:Finished building network

In [1]:


In [2]:
result


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-a5b1e83cd027> in <module>()
----> 1 result

NameError: name 'result' is not defined

In [3]:
from autonetkit_cisco.collection import query_lang

In [4]:
result = query_lang.process_query("UPDATE ospf.edges SET abc=123,def=456 WHERE (src=iosv-7) ;")
print result


{'query': {'action': 'update_edge', 'query': {'src': 'iosv-7'}, 'set': {'abc': '123', 'def': '456'}, 'overlay': 'ospf'}}

In [5]:
query_lang.apply_query(anm, result)


WARNING Unable to find node None in ospf 
WARNING:ANK:Unable to find node None in ospf 
{'query': {'action': 'update_edge', 'query': {'src': 'iosv-7'}, 'set': {'abc': '123', 'def': '456'}, 'overlay': 'ospf'}}
{'src': 'iosv-7'}
{'abc': '123', 'def': '456'}
iosv-7
bunch [iosv-7] None
edges [ospf: (iosv-7, iosxrv-1), ospf: (iosv-7, iosv-2)]
Out[5]:
ANM 20140508_154939

In [8]:
autonetkit.update_vis(anm)

In [7]:
g_ospf = anm['ospf']
for edge in g_ospf.edges():
    print edge.dump()


{'_ports': {'3430016387549': 2, '3430011387534': 2}, 'cost': 1, 'area': 0}
{'_ports': {'3430016387549': 1, '3430010387531': 3}, 'cost': 1, 'area': 0}
{'_ports': {'3430013387540': 1, '3430019387558': 1}, 'cost': 1, 'area': 0}
{'_ports': {'3430013387540': 2, '3430022387567': 2}, 'cost': 1, 'area': 0}
{'_ports': {'3430013387540': 3, '3430012387537': 3}, 'cost': 1, 'area': 0}
{'_ports': {'3430024387573': 3, '3430014387543': 1}, 'cost': 1, 'abc': '123', 'def': '456', 'area': 0}
{'_ports': {'3430014387543': 2, '3430020387561': 1}, 'cost': 1, 'abc': '123', 'def': '456', 'area': 0}
{'_ports': {'3430025387576': 2, '3430010387531': 2}, 'cost': 1, 'area': 0}
{'_ports': {'3430010387531': 1, '3430012387537': 2}, 'cost': 1, 'area': 0}
{'_ports': {'3430023387570': 1, '3430020387561': 3}, 'cost': 1, 'area': 0}
{'_ports': {'3430021387564': 2, '3430020387561': 2}, 'cost': 1, 'area': 0}
{'_ports': {'3430023387570': 2, '3430015387546': 1}, 'cost': 1, 'area': 0}
{'_ports': {'3430021387564': 3, '3430015387546': 2}, 'cost': 1, 'area': 0}
{'_ports': {'3430015387546': 3, '3430022387567': 3}, 'cost': 1, 'area': 0}
{'_ports': {'3430024387573': 4, '3430012387537': 4}, 'cost': 1, 'area': 0}
{'_ports': {'3430019387558': 2, '3430012387537': 1}, 'cost': 1, 'area': 0}
{'_ports': {'3430024387573': 2, '3430021387564': 1}, 'cost': 1, 'area': 0}
{'_ports': {'3430024387573': 1, '3430025387576': 3}, 'cost': 1, 'area': 0}
{'_ports': {'3430011387534': 1, '3430025387576': 1}, 'cost': 1, 'area': 0}
{'_ports': {'3430021387564': 4, '3430022387567': 1}, 'cost': 1, 'area': 0}
{'_ports': {'3430021387564': 5, '3430019387558': 3}, 'cost': 1, 'area': 0}

In [ ]:
print