3 from requests.auth import HTTPBasicAuth
7 REGISTER_EP_URL="http://%s:8181/restconf/operations/endpoint:register-endpoint"
8 REGISTER_TENANTS_URL="http://%s:8181/restconf/config/policy:tenants"
9 REGISTER_NODES_URL="http://%s:8181/restconf/config/opendaylight-inventory:nodes"
13 def get_epg(tenantId, epgId):
14 k = "{}|{}".format(tenantId,epgId)
15 if k in endpointGroups:
16 return endpointGroups[k]
17 tenant = get_tenant(tenantId);
20 "consumer-named-selector": [],
21 "provider-named-selector": []
23 tenant["endpoint-group"].append(data)
24 endpointGroups[k] = data
29 # This is where some of the policy is set, subject and classifiers
30 def get_tenant(tenantId):
31 if tenantId in tenants:
32 return tenants[tenantId]
36 "l2-bridge-domain": [],
37 "l2-flood-domain": [],
41 "subject-feature-instances": {
42 "classifier-instance": [
44 "classifier-definition-id": "4250ab32-e8b8-445a-aebb-e1bd2cdd291f",
47 "string-value": "TCP"},
52 "classifier-definition-id": "4250ab32-e8b8-445a-aebb-e1bd2cdd291f",
55 "string-value": "TCP"},
56 {"name": "sourceport",
60 "classifier-definition-id": "79c6fdb2-1e1a-4832-af57-c65baf5c2335",
68 tenants[tenantId] = data
73 def get_fd(tenantId, fdId, parent):
74 tenant = get_tenant(tenantId)
77 tenant["l2-flood-domain"].append(data)
80 def get_bd(tenantId, bdId, parent):
81 tenant = get_tenant(tenantId)
84 tenant["l2-bridge-domain"].append(data)
87 def get_l3c(tenantId, l3cId):
88 tenant = get_tenant(tenantId)
90 tenant["l3-context"].append(data)
93 def get_subnet(tenantId, subnetId, parent, prefix, router):
94 k = "{}|{}".format(tenantId, subnetId)
97 tenant = get_tenant(tenantId)
98 data = {"id": subnetId,
101 "virtual-router-ip": router}
102 tenant["subnet"].append(data)
107 def get_ep(tenantId, groupId, l3ctx, ip, l2ctx, mac, sw, port):
108 group = get_epg(tenantId, groupId)
109 data = {"tenant": tenantId,
110 "endpoint-group": groupId,
113 "l3-address": [{"l3-context": l3ctx,
115 "ofoverlay:node-id": "openflow:{}".format(sw),
116 "ofoverlay:node-connector-id": "openflow:{}:{}".format(sw, port)
118 endpoints.append(data)
123 def get_node_config(sw, tun_ip):
125 "id": "openflow:{}".format(sw),
126 "ofoverlay:tunnel-ip": tun_ip
131 # This is where specifics of the contract are defined. Note: Classifiers are SET in the get_tenant procedure.
132 def get_contract(tenantId, pgroupId, cgroupId, contractId):
133 tenant = get_tenant(tenantId)
134 pgroup = get_epg(tenantId, pgroupId)
135 cgroup = get_epg(tenantId, cgroupId)
138 "subject": [{"name": "allow-http-subject",
140 {"name": "allow-http-rule",
142 {"name": "http-dest",
148 {"name": "allow-icmp-subject",
150 {"name": "allow-icmp-rule",
155 "clause": [{"name": "allow-http-clause",
156 "subject-refs": ["allow-http-subject",
157 "allow-icmp-subject"]}]
159 tenant["contract"].append(data)
160 cgroup["consumer-named-selector"].append({
161 "name": "{}-{}-{}".format(pgroupId, cgroupId, contractId),
162 "contract": [contractId]
164 pgroup["provider-named-selector"].append({
165 "name": "{}-{}-{}".format(pgroupId, cgroupId, contractId),
166 "contract": [contractId]
172 headers = {'Content-type': 'application/yang.data+json',
173 'Accept': 'application/yang.data+json'}
174 print "POST %s" % url
175 print json.dumps(data, indent=4, sort_keys=True)
176 r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
181 headers = {'Content-type': 'application/yang.data+json',
182 'Accept': 'application/yang.data+json'}
184 print json.dumps(data, indent=4, sort_keys=True)
185 r = requests.put(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
189 def register_tenants(contHost):
190 data = {"policy:tenants": {"tenant": tenants.values()}}
191 put(REGISTER_TENANTS_URL % contHost, data)
193 def register_eps(contHost):
196 post(REGISTER_EP_URL % contHost, data)
198 def register_nodes(contHost):
199 data = {"opendaylight-inventory:nodes": {"node": nodes}}
200 put(REGISTER_NODES_URL % contHost, data)