blob: 02fa9b9a8153f8d06ff182b270d93b15dde15567 [file] [log] [blame]
Scott Bakerc3ce3e72016-06-20 17:35:19 -07001import os
2import requests
3import socket
4import sys
5import base64
6from django.db.models import F, Q
7from xos.config import Config
8from synchronizers.base.syncstep import SyncStep
9from core.models import Service, Tenant
10from core.models.service import COARSE_KIND
11from xos.logger import Logger, logging
12from requests.auth import HTTPBasicAuth
13
14# hpclibrary will be in steps/..
15parentdir = os.path.join(os.path.dirname(__file__),"..")
16sys.path.insert(0,parentdir)
17
18logger = Logger(level=logging.INFO)
19
20# XXX should save and load this
21glo_saved_vtn_maps = []
22
23class SyncTenant(SyncStep):
24 provides=[Tenant]
25 observes=Tenant
26 requested_interval=0
27
28 def __init__(self, **args):
29 SyncStep.__init__(self, **args)
30
31 def get_vtn_onos_service(self):
Scott Baker1e7db282016-08-31 23:27:58 -070032 from services.onos.models import ONOSService
33
Scott Bakerc3ce3e72016-06-20 17:35:19 -070034# vtn_tenant = Tenant.objects.filter(name="VTN_ONOS_app") # XXX fixme - hardcoded
35# if not vtn_tenant:
36# raise "No VTN Onos App found"
37# vtn_tenant = vtn_tenant[0]
38#
39# vtn_service = vtn_tenant.provider_service
Scott Baker1e7db282016-08-31 23:27:58 -070040 vtn_service = ONOSService.get_service_objects().filter(name="ONOS_CORD") # XXX fixme - harcoded
Scott Bakerc3ce3e72016-06-20 17:35:19 -070041 if not vtn_service:
42 raise "No VTN Onos Service"
43
44 return vtn_service[0]
45
46 def get_vtn_addr(self):
47 vtn_service = self.get_vtn_onos_service()
48
Scott Baker1e7db282016-08-31 23:27:58 -070049 if vtn_service.rest_hostname:
50 return vtn_service.rest_hostname
51
Scott Bakerc3ce3e72016-06-20 17:35:19 -070052 if not vtn_service.slices.exists():
53 raise "VTN Service has no slices"
54
55 vtn_slice = vtn_service.slices.all()[0]
56
57 if not vtn_slice.instances.exists():
58 raise "VTN Slice has no instances"
59
60 vtn_instance = vtn_slice.instances.all()[0]
61
62 return vtn_instance.node.name
63
64 def call(self, **args):
65 global glo_saved_vtn_maps
66
67 logger.info("sync'ing vtn services")
68
69 vtn_maps = []
70 for service in Service.objects.all():
71 for id in service.get_vtn_src_ids():
72 dependencies = service.get_vtn_dependencies_ids()
73 if dependencies:
74 for dependency in dependencies:
75 vtn_maps.append( (id, dependency) )
76
77 for vtn_map in vtn_maps:
78 if not (vtn_map in glo_saved_vtn_maps):
79 # call vtn rest api to add map
80 url = "http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/service-dependency/%s/%s" % (vtn_map[0], vtn_map[1])
81
82 print "POST %s" % url
83 r = requests.post(url, auth=HTTPBasicAuth('karaf', 'karaf') ) # XXX fixme - hardcoded auth
84 if (r.status_code != 200):
85 raise Exception("Received error from vtn service (%d)" % r.status_code)
86
87 for vtn_map in glo_saved_vtn_maps:
88 if not vtn_map in vtn_maps:
89 # call vtn rest api to delete map
90 url = "http://" + self.get_vtn_addr() + ":8181/onos/cordvtn/service-dependency/%s/%s" % (vtn_map[0],vtn_map[1])
91
92 print "DELETE %s" % url
93 r = requests.delete(url, auth=HTTPBasicAuth('karaf', 'karaf') ) # XXX fixme - hardcoded auth
94 if (r.status_code != 200):
95 raise Exception("Received error from vtn service (%d)" % r.status_code)
96
97 glo_saved_vtn_maps = vtn_maps
98 # TODO: save this
99