#! /usr/bin/env python
'''
This file creates the ONOS intents for the sanity 4 nodes tests. These intents will be translated into flows by ONOS and pushed to the switches.
'''

import json
import requests

url = 'http://127.0.0.1:8080/wm/onos/datagrid/add/intents/json'
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}


'''response
[{'intent_id':'5','status':'CREATED','log':['created, time:73268214932534']}]
'''



for i in range(6,16):
    #intent = [{'intent_id': '%d' %i,'intent_type':'shortest_intent_type','intent_op':'add','srcSwitch':'8249','srcPort':1,'srcMac':'00:00:00:00:00:01','dstSwitch':'4103','dstPort':1,'dstMac':'00:00:00:00:00:02'}]
    srcMac = '00:00:00:00:00:'+ str(hex(i)[2:]).zfill(2)
    dstMac = '00:00:00:00:00:'+ str(hex(i+10)[2:])
    srcSwitch = '00:00:00:00:00:00:10:'+ str(i).zfill(2)
    dstSwitch = '00:00:00:00:00:00:20:'+ str(i+25)
    srcPort = 1 
    dstPort = 1 

    intent = [{'intent_id': '%d' %(i),'intent_type':'shortest_intent_type','intent_op':'add','srcSwitch':srcSwitch,'srcPort':srcPort,'srcMac':srcMac,'dstSwitch':dstSwitch,'dstPort':dstPort,'dstMac':dstMac}]


    print json.dumps(intent, sort_keys = True)


    #r = requests.post(url, data=json.dumps(iid, sort_keys=True)+json.dumps(intent, sort_keys=True), headers = headers)
    r = requests.post(url, data=json.dumps(intent, sort_keys=True), headers = headers)
    print r
    print r.content



    intent = [{'intent_id': '%d' %(i+10),'intent_type':'shortest_intent_type','intent_op':'add','srcSwitch':dstSwitch,'srcPort':dstPort,'srcMac':dstMac,'dstSwitch':srcSwitch,'dstPort':srcPort,'dstMac':srcMac}]
    print json.dumps(intent, sort_keys = True)
    r = requests.post(url, data=json.dumps(intent, sort_keys=True), headers = headers)
    print r
    print r.content

