CORD-1849 Split XOS code out of OLT and VTN repos
Change-Id: I93f9db4f20f79645841809a73f60522965f0d865
diff --git a/xos/README.md b/xos/README.md
deleted file mode 100644
index c974a1f..0000000
--- a/xos/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# VTN development notes #
-
-## Public Address ServiceInstances ##
-
-Hardcoded dependencies to `VRouterTenant` have been eliminated. It's now assumed that any ServiceInstance that has `public_ip` and `public_mac` fields provides the addressing functionality that VRouterTenant used to provide.
-
-## Determining Additional Address Pairs ##
-
-The VTN synchronizer will compute additional addresses attached to a port based on the following criteria:
-
-1) If an instance has an `vm_vrouter_tag` or `vm_public_service_instance` tag attached to it, and that tag points to a ServiceInstance that has `public_ip` and `public_mac` fields, then that address pair will be added to the ports for any access networks on that instance. (TODO: replace tag with link?)
-
-`vm_vrouter_tag` is deprecated in favor of the service-neutron name `vm_public_service_instance`.
-
-2) If there exists a tenant associated with an instance, and that tenant has a `SerivceInstanceLink` to a ServiceInstance that has `public_ip` and `public_mac` fields, then that address pair will be added to the ports for any access networks on that instance.
-
-## Determining vlan_id ##
-
-A port will be given a `vlan_id` if there exists a `vlan_id` or `s_tag` tag associated with the instance, and that port is an access network.
-
-`s_tag` is deprecated in favor of the service-neutral name `vlan_id`.
-
-## Determining access networks ##
-
-A network is an access network (i.e. supports vlan_id and address_pairs) if it's VTN kind is in the
-set `["VSG", ]`. (TODO: Find a better way to mark address networks)
-
-## Determining Public Gateways ##
-
-The VTN synchronizer determines public gateways by examining `AddressPool` objects. Each `AddressPool` has a `gateway_ip` and `gateway_mac` field.
\ No newline at end of file
diff --git a/xos/attic/header.py b/xos/attic/header.py
deleted file mode 100644
index 803d477..0000000
--- a/xos/attic/header.py
+++ /dev/null
@@ -1,30 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-from django.db import models
-from django.db.models import *
-from core.models import Service
-from core.models.xosbase import StrippedCharField
-import os
-from django.db import models, transaction
-from django.forms.models import model_to_dict
-import traceback
-from xos.exceptions import *
-
-class ConfigurationError(Exception):
- pass
-
-VTN_KIND = "VTN"
diff --git a/xos/header.py b/xos/header.py
deleted file mode 120000
index 721b5c0..0000000
--- a/xos/header.py
+++ /dev/null
@@ -1 +0,0 @@
-attic/header.py
\ No newline at end of file
diff --git a/xos/synchronizer/Dockerfile.synchronizer b/xos/synchronizer/Dockerfile.synchronizer
deleted file mode 100644
index 9de9142..0000000
--- a/xos/synchronizer/Dockerfile.synchronizer
+++ /dev/null
@@ -1,57 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-# xosproject/vtn-synchronizer
-FROM xosproject/xos-synchronizer-base:candidate
-
-COPY . /opt/xos/synchronizers/vtn
-
-COPY __init__.py /opt/xos/services/__init__.py
-
-ENTRYPOINT []
-
-WORKDIR "/opt/xos/synchronizers/vtn"
-
-# Label image
-ARG org_label_schema_schema_version=1.0
-ARG org_label_schema_name=vtn-synchronizer
-ARG org_label_schema_version=unknown
-ARG org_label_schema_vcs_url=unknown
-ARG org_label_schema_vcs_ref=unknown
-ARG org_label_schema_build_date=unknown
-ARG org_opencord_vcs_commit_date=unknown
-ARG org_opencord_component_chameleon_version=unknown
-ARG org_opencord_component_chameleon_vcs_url=unknown
-ARG org_opencord_component_chameleon_vcs_ref=unknown
-ARG org_opencord_component_xos_version=unknown
-ARG org_opencord_component_xos_vcs_url=unknown
-ARG org_opencord_component_xos_vcs_ref=unknown
-
-LABEL org.label-schema.schema-version=$org_label_schema_schema_version \
- org.label-schema.name=$org_label_schema_name \
- org.label-schema.version=$org_label_schema_version \
- org.label-schema.vcs-url=$org_label_schema_vcs_url \
- org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
- org.label-schema.build-date=$org_label_schema_build_date \
- org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date \
- org.opencord.component.chameleon.version=$org_opencord_component_chameleon_version \
- org.opencord.component.chameleon.vcs-url=$org_opencord_component_chameleon_vcs_url \
- org.opencord.component.chameleon.vcs-ref=$org_opencord_component_chameleon_vcs_ref \
- org.opencord.component.xos.version=$org_opencord_component_xos_version \
- org.opencord.component.xos.vcs-url=$org_opencord_component_xos_vcs_url \
- org.opencord.component.xos.vcs-ref=$org_opencord_component_xos_vcs_ref
-
-CMD bash -c "cd /opt/xos/synchronizers/vtn; ./run-from-api.sh"
diff --git a/xos/synchronizer/__init__.py b/xos/synchronizer/__init__.py
deleted file mode 100644
index d4e8062..0000000
--- a/xos/synchronizer/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
diff --git a/xos/synchronizer/model-deps b/xos/synchronizer/model-deps
deleted file mode 100644
index 0967ef4..0000000
--- a/xos/synchronizer/model-deps
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/xos/synchronizer/run-from-api.sh b/xos/synchronizer/run-from-api.sh
deleted file mode 100755
index 70ea7eb..0000000
--- a/xos/synchronizer/run-from-api.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-python vtn-synchronizer.py
diff --git a/xos/synchronizer/steps/sync_onos_netcfg.py b/xos/synchronizer/steps/sync_onos_netcfg.py
deleted file mode 100644
index 67dc878..0000000
--- a/xos/synchronizer/steps/sync_onos_netcfg.py
+++ /dev/null
@@ -1,202 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-import os
-import requests
-import socket
-import sys
-import base64
-import json
-from synchronizers.new_base.syncstep import SyncStep
-from synchronizers.new_base.modelaccessor import *
-from xos.logger import Logger, logging
-
-logger = Logger(level=logging.INFO)
-
-class SyncONOSNetcfg(SyncStep):
- provides=[VTNService]
- observes=VTNService
- watches=[ModelLink(Node,via='node'), ModelLink(AddressPool,via='addresspool')]
- requested_interval=0
-
- def __init__(self, **args):
- SyncStep.__init__(self, **args)
-
- def handle_watched_object(self, o):
- logger.info("handle_watched_object is invoked for object %s" % (str(o)),extra=o.tologdict())
- if (type(o) is Node): # For Node add/delete/modify
- self.call()
- if (type(o) is AddressPool): # For public gateways
- self.call()
-
- def get_node_tag(self, node, tagname):
- tags = Tag.objects.filter(content_type=model_accessor.get_content_type_id(node),
- object_id=node.id,
- name=tagname)
- return tags[0].value
-
- def get_service_instances_who_want_config(self):
- service_instances = []
- # attribute is comma-separated list
- for ta in ServiceInstanceAttribute.objects.filter(name="autogenerate"):
- if ta.value:
- for config in ta.value.split(','):
- if config == "vtn-network-cfg":
- service_instances.append(ta.service_instance)
- return service_instances
-
- def save_service_instance_attribute(self, service_instance, name, value):
- tas = ServiceInstanceAttribute.objects.filter(service_instance_id=service_instance.id, name=name)
- if tas:
- ta = tas[0]
- if ta.value != value:
- logger.info("updating %s with attribute" % name)
- ta.value = value
- ta.save()
- else:
- logger.info("saving autogenerated config %s" % name)
- ta = model_accessor.create_obj(ServiceInstanceAttribute, service_instance=service_instance, name=name, value=value)
- ta.save()
-
- # This function currently assumes a single Deployment and Site
- def get_onos_netcfg(self, vtn):
- privateGatewayMac = vtn.privateGatewayMac
- localManagementIp = vtn.localManagementIp
- ovsdbPort = vtn.ovsdbPort
- sshPort = vtn.sshPort
- sshUser = vtn.sshUser
- sshKeyFile = vtn.sshKeyFile
- mgmtSubnetBits = vtn.mgmtSubnetBits
- xosEndpoint = vtn.xosEndpoint
- xosUser = vtn.xosUser
- xosPassword = vtn.xosPassword
-
- controllerPort = vtn.controllerPort
- if ":" in controllerPort:
- (c_hostname, c_port) = controllerPort.split(":",1)
- controllerPort = socket.gethostbyname(c_hostname) + ":" + c_port
- else:
- controllerPort = ":" + controllerPort
-
- data = {
- "apps" : {
- "org.opencord.vtn" : {
- "cordvtn" : {
- "privateGatewayMac" : privateGatewayMac,
- "localManagementIp": localManagementIp,
- "ovsdbPort": ovsdbPort,
- "ssh": {
- "sshPort": sshPort,
- "sshUser": sshUser,
- "sshKeyFile": sshKeyFile
- },
- "xos": {
- "endpoint": xosEndpoint,
- "user": xosUser,
- "password": xosPassword
- },
- "publicGateways": [],
- "nodes" : [],
- "controllers": [controllerPort]
- }
- }
- }
- }
-
- # Generate apps->org.opencord.vtn->cordvtn->openstack
- controllers = Controller.objects.all()
- if controllers:
- controller = controllers[0]
- keystone_server = controller.auth_url
- user_name = controller.admin_user
- tenant_name = controller.admin_tenant
- password = controller.admin_password
- openstack = {
- "endpoint": keystone_server,
- "tenant": tenant_name,
- "user": user_name,
- "password": password
- }
- data["apps"]["org.opencord.vtn"]["cordvtn"]["openstack"] = openstack
-
- # Generate apps->org.opencord.vtn->cordvtn->nodes
- nodes = Node.objects.all()
- for node in nodes:
- try:
- nodeip = socket.gethostbyname(node.name)
- except socket.gaierror:
- logger.warn("unable to resolve hostname %s: node will not be added to config"
- % node.name)
- continue
-
- try:
- bridgeId = self.get_node_tag(node, "bridgeId")
- dataPlaneIntf = self.get_node_tag(node, "dataPlaneIntf")
- dataPlaneIp = self.get_node_tag(node, "dataPlaneIp")
- except:
- logger.error("not adding node %s to the VTN configuration" % node.name)
- continue
-
- node_dict = {
- "hostname": node.name,
- "hostManagementIp": "%s/%s" % (nodeip, mgmtSubnetBits),
- "bridgeId": bridgeId,
- "dataPlaneIntf": dataPlaneIntf,
- "dataPlaneIp": dataPlaneIp
- }
-
- # this one is optional
- try:
- node_dict["hostManagementIface"] = self.get_node_tag(node, "hostManagementIface")
- except IndexError:
- pass
-
- data["apps"]["org.opencord.vtn"]["cordvtn"]["nodes"].append(node_dict)
-
- # Generate apps->org.onosproject.cordvtn->cordvtn->publicGateways
- # Pull the gateway information from Address Pool objects
- for ap in AddressPool.objects.all():
- if (not ap.gateway_ip) or (not ap.gateway_mac):
- logger.info("Gateway_ip or gateway_mac is blank for addresspool %s. Skipping." % ap)
- continue
-
- gateway_dict = {
- "gatewayIp": ap.gateway_ip,
- "gatewayMac": ap.gateway_mac
- }
- data["apps"]["org.opencord.vtn"]["cordvtn"]["publicGateways"].append(gateway_dict)
-
- if not AddressPool.objects.all().exists():
- logger.info("No Address Pools present, not adding publicGateways to config")
-
- return json.dumps(data, indent=4, sort_keys=True)
-
- # TODO: Does this step execute every 5 seconds regardless of whether objects have changed?
- # If so, what purpose does using watchers serve?
-
- def call(self, **args):
- vtn_service = VTNService.objects.all()
- if not vtn_service:
- raise Exception("No VTN Service")
-
- vtn_service = vtn_service[0]
-
- # Check for autogenerate attribute
- netcfg = self.get_onos_netcfg(vtn_service)
-
- service_instances = self.get_service_instances_who_want_config()
- for service_instance in service_instances:
- self.save_service_instance_attribute(service_instance, "rest_onos/v1/network/configuration/", netcfg)
diff --git a/xos/synchronizer/steps/sync_vtn_service.py b/xos/synchronizer/steps/sync_vtn_service.py
deleted file mode 100644
index e4d4b4f..0000000
--- a/xos/synchronizer/steps/sync_vtn_service.py
+++ /dev/null
@@ -1,227 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-import os
-import requests
-import socket
-import sys
-import base64
-from synchronizers.vtn.vtnnetport import VTNNetwork, VTNPort
-from synchronizers.new_base.syncstep import SyncStep
-from synchronizers.new_base.modelaccessor import *
-from xos.logger import Logger, logging
-from requests.auth import HTTPBasicAuth
-
-logger = Logger(level=logging.INFO)
-
-# XXX should save and load this
-glo_saved_networks = {}
-glo_saved_ports = {}
-
-class SyncVTNService(SyncStep):
- provides=[Service]
- observes=Service
- requested_interval=0
-
- def __init__(self, **args):
- SyncStep.__init__(self, **args)
-
- def get_vtn_onos_app(self, vtn_service):
- links = vtn_service.subscribed_links.all()
- for link in links:
- # We're looking for an ONOS App. It's the only ServiceInstance that VTN can be implemented on.
- if link.provider_service_instance.leaf_model_name != "ONOSApp":
- continue
-
- # TODO: Rather than checking model name, check for the right interface
- # NOTE: Deferred until new Tosca engine is in place.
-
- #if not link.provider_service_interface:
- # logger.warning("Link %s does not have a provider_service_interface. Skipping" % link)
- # continue
- #
- #if link.provider_service_interface.interface_type.name != "onos_app_interface":
- # logger.warning("Link %s provider_service_interface type is not equal to onos_app_interface" % link)
- # continue
-
- # cast from ServiceInstance to ONOSApp
- app = link.provider_service_instance.leaf_model
- return app
-
- raise Exception("No ServiceInstanceLink from VTN Service to VTN ONOS App")
-
- def get_vtn_endpoint(self, vtn_service):
- """ Get connection info for the ONOS that is hosting the VTN ONOS App.
-
- returns (hostname, port, auth)
- """
- app = self.get_vtn_onos_app(vtn_service)
- # cast from Service to ONOSService
- onos = app.owner.leaf_model
- if not (onos.rest_hostname):
- raise Exception("onos.rest_hostname is not set")
- if not (onos.rest_port):
- raise Exception("onos.rest_port is not set")
- if not (onos.rest_password):
- raise Exception("onos.rest_password is not set")
- if not (onos.rest_username):
- raise Exception("onos.rest_username is not set")
- auth = HTTPBasicAuth(onos.rest_username, onos.rest_password)
- return (onos.rest_hostname, onos.rest_port, auth)
-
- def get_method(self, auth, url, id):
- url_with_id = "%s/%s" % (url, id)
- r = requests.get(url_with_id, auth=auth)
- if (r.status_code==200):
- method="PUT"
- url = url_with_id
- req_func = requests.put
- exists=True
- else:
- method="POST"
- req_func = requests.post
- exists=False
- return (exists, url, method, req_func)
-
- def sync_service_networks(self, vtn_service):
- (onos_hostname, onos_port, onos_auth) = self.get_vtn_endpoint(vtn_service)
-
- valid_ids = []
- for network in Network.objects.all():
- network = VTNNetwork(network)
-
- if not network.id:
- continue
-
- if (network.type=="PRIVATE") and (not network.providerNetworks):
- logger.info("Skipping network %s because it has no relevant state" % network.id)
- continue
-
- valid_ids.append(network.id)
-
- if (glo_saved_networks.get(network.id, None) != network.to_dict()):
- (exists, url, method, req_func) = self.get_method(onos_auth, "http://%s:%d/onos/cordvtn/serviceNetworks" % (onos_hostname, onos_port), network.id)
-
- logger.info("%sing VTN API for network %s" % (method, network.id))
-
- logger.info("URL: %s" % url)
-
- # clean the providerNetworks list
- providerNetworks = [{"id": x["id"], "bidirectional": x["bidirectional"]} for x in network.providerNetworks]
-
- data = {"ServiceNetwork": {"id": network.id,
- "type": network.type,
- "providerNetworks": providerNetworks} }
- logger.info("DATA: %s" % str(data))
-
- r=req_func(url, json=data, auth=onos_auth )
- if (r.status_code in [200,201]):
- glo_saved_networks[network.id] = network.to_dict()
- else:
- logger.error("Received error from vtn service (%d)" % r.status_code)
-
-
- for network_id in glo_saved_networks.keys():
- if network_id not in valid_ids:
- logger.info("DELETEing VTN API for network %s" % network_id)
-
- url = "http://%s:%d/onos/cordvtn/serviceNetworks/%s" % (onos_hostname, onos_port, network_id)
- logger.info("URL: %s" % url)
-
- r = requests.delete(url, auth=onos_auth )
- if (r.status_code in [200,204]):
- del glo_saved_networks[network_id]
- else:
- logger.error("Received error from vtn service (%d)" % r.status_code)
-
- def sync_service_ports(self, vtn_service):
- (onos_hostname, onos_port, onos_auth) = self.get_vtn_endpoint(vtn_service)
-
- valid_ids = []
- for port in Port.objects.all():
- port = VTNPort(port)
-
- if not port.id:
- continue
-
- if (not port.vlan_id) and (not port.floating_address_pairs):
- logger.info("Skipping port %s because it has no relevant state" % port.id)
- continue
-
- valid_ids.append(port.id)
-
- if (glo_saved_ports.get(port.id, None) != port.to_dict()):
- (exists, url, method, req_func) = self.get_method(onos_auth, "http://%s:%d/onos/cordvtn/servicePorts" % (onos_hostname, onos_port), port.id)
-
- logger.info("%sing VTN API for port %s" % (method, port.id))
-
- logger.info("URL: %s" % url)
-
- data = {"ServicePort": {"id": port.id,
- "vlan_id": port.vlan_id,
- "floating_address_pairs": port.floating_address_pairs} }
- logger.info("DATA: %s" % str(data))
-
- r=req_func(url, json=data, auth=onos_auth )
- if (r.status_code in [200,201]):
- glo_saved_ports[port.id] = port.to_dict()
- else:
- logger.error("Received error from vtn service (%d)" % r.status_code)
-
- for port_id in glo_saved_ports.keys():
- if port_id not in valid_ids:
- logger.info("DELETEing VTN API for port %s" % port_id)
-
- url = "http://%s:%d/onos/cordvtn/servicePorts/%s" % (onos_hostname, onos_port, port_id)
- logger.info("URL: %s" % url)
-
- r = requests.delete(url, auth=onos_auth )
- if (r.status_code in [200,204]):
- del glo_saved_ports[port_id]
- else:
- logger.error("Received error from vtn service (%d)" % r.status_code)
-
- def call(self, **args):
- global glo_saved_networks
- global glo_saved_ports
-
- vtn_service = VTNService.objects.all()
- if not vtn_service:
- raise Exception("No VTN Service")
-
- vtn_service = vtn_service[0]
-
- # TODO: We should check get_vtn_onos_app() and make sure that it has been synced, and that any necessary
- # attributes (netcfg, etc) is filled out.
-
- if (vtn_service.resync):
- # If the VTN app requested a full resync, clear our saved network
- # so we will resync everything, then reset the 'resync' flag
- glo_saved_networks = {}
- glo_saved_ports = {}
-
- vtn_service.resync = False
- vtn_service.save()
-
- if vtn_service.vtnAPIVersion>=2:
- # version 2 means use new API
- logger.info("Using New API")
- self.sync_service_networks(vtn_service)
- self.sync_service_ports(vtn_service)
- else:
- raise Exception("VTN API Version 1 is no longer supported by VTN Synchronizer")
-
-
diff --git a/xos/synchronizer/vtn-synchronizer.py b/xos/synchronizer/vtn-synchronizer.py
deleted file mode 100755
index b5944a8..0000000
--- a/xos/synchronizer/vtn-synchronizer.py
+++ /dev/null
@@ -1,35 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-from xosconfig import Config
-
-config_file = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/vtn_config.yaml')
-Config.init(config_file, 'synchronizer-config-schema.yaml')
-
-sys.path.append('/opt/xos')
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
-
-mod = importlib.import_module("synchronizers.new_base.xos-synchronizer")
-mod.main()
-
diff --git a/xos/synchronizer/vtn_config.yaml b/xos/synchronizer/vtn_config.yaml
deleted file mode 100644
index 5a799de..0000000
--- a/xos/synchronizer/vtn_config.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-name: vtn-synchronizer
-accessor:
- username: xosadmin@opencord.org
- password: "@/opt/xos/services/vtn/credentials/xosadmin@opencord.org"
-dependency_graph: "/opt/xos/synchronizers/vtn/model-deps"
-steps_dir: "/opt/xos/synchronizers/vtn/steps"
-sys_dir: "/opt/xos/synchronizers/vtn/sys"
\ No newline at end of file
diff --git a/xos/synchronizer/vtnnetport.py b/xos/synchronizer/vtnnetport.py
deleted file mode 100644
index eaa037f..0000000
--- a/xos/synchronizer/vtnnetport.py
+++ /dev/null
@@ -1,299 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-from synchronizers.new_base.modelaccessor import *
-in_synchronizer = True
-
-class VTNNetwork(object):
- def __init__(self, xos_network=None):
- self.xos_network = xos_network
-
- def get_controller_network(self):
- for cn in self.xos_network.controllernetworks.all():
- # TODO: find the right one
- return cn
- return None
-
- def get_cn_field(self, fieldname):
- cn=self.get_controller_network()
- if not cn:
- return None
- return getattr(cn, fieldname)
-
- @property
- def id(self):
- return self.get_cn_field("net_id")
-
- @property
- def name(self):
- return self.xos_network.name
-
- @property
- def subnet(self):
- return self.get_cn_field("subnet")
-
- @property
- def gateway(self):
- return self.get_cn_field("gateway")
-
- @property
- def segmentation_id(self):
- return self.get_cn_field("segmentation_id")
-
- @property
- def type(self):
- return self.xos_network.template.vtn_kind
-
- @property
- def providerNetworks(self):
- slice = self.xos_network.owner
- service = slice.service
- if not service:
- return []
-
- nets=[]
- for dep in service.subscribed_dependencies.all():
- if dep.provider_service:
- bidirectional = dep.connect_method!="private-unidirectional"
- for net in dep.provider_service.get_composable_networks():
- if not net.controllernetworks.exists():
- continue
-
- cn = net.controllernetworks.all()[0]
-
- if not cn.net_id:
- continue
-
- nets.append({"id": cn.net_id,
- "name": net.name,
- "bidirectional": bidirectional})
- return nets
-
- @property
- def subscriberNetworks(self):
- slice = self.xos_network.owner
- service = slice.service
- if not service:
- return []
-
- nets=[]
- for dep in service.provided_dependencies.all():
- if dep.subscriber_service:
- bidirectional = dep.connect_method!="private-unidirectional"
- for net in dep.subscriber_service.get_composable_networks():
- if not net.controllernetworks.exists():
- continue
-
- cn = net.controllernetworks.all()[0]
-
- if not cn.net_id:
- continue
-
- nets.append({"id": cn.net_id,
- "name": net.name,
- "bidirectional": bidirectional})
- return nets
-
- @property
- def ownerSliceName(self):
- if self.xos_network.owner:
- return self.xos_network.owner.name
- return None
-
- @property
- def ownerServiceName(self):
- if self.xos_network.owner and self.xos_network.owner.service:
- return self.xos_network.owner.service.name
- return None
-
- def to_dict(self):
- return {"id": self.id,
- "name": self.name,
- "subnet": self.subnet,
- "gateway": self.gateway,
- "segmentation_id": self.segmentation_id,
- "type": self.type,
- "providerNetworks": self.providerNetworks,
- "subscriberNetworks": self.subscriberNetworks,
- "ownerSliceName": self.ownerSliceName,
- "ownerServiceName": self.ownerServiceName}
-
- def __eq__(self, other):
- return self.to_dict() == other.to_dict()
-
-class VTNPort(object):
- def __init__(self, xos_port=None):
- self.xos_port = xos_port
-
- def get_controller_network(self):
- for cn in self.xos_port.network.controllernetworks.all():
- # TODO: find the right one
- return cn
- return None
-
- def is_access_network(self):
- """ Determines whether this port is attached to an access network. Currently we do this by examining the
- network template's vtn_kind field. See if there is a better way...
- """
- return self.xos_port.network.template.vtn_kind in ["VSG", ]
-
- def get_vm_addresses(self):
- if not self.is_access_network():
- # If not an access network, do not apply any addresses
- return []
-
- if not self.xos_port.instance:
- return []
-
- # See if the Instance has any public address (aka "VrouterTenant) service instances associated with it.
- # If so, then add each of those to the set of address pairs.
-
- # TODO: Perhaps this should be implemented as a link instead of a tag...
-
- tags = Tag.objects.filter(name="vm_public_service_instance", object_id=self.xos_port.instance.id,
- content_type=self.xos_port.instance.self_content_type_id)
-
- if not tags:
- # DEPRECATED
- # Historically, VSG instances are tagged with "vm_vrouter_tenant" instead of "vm_public_service_instance"
- tags = Tag.objects.filter(name="vm_vrouter_tenant", object_id=self.xos_port.instance.id,
- content_type=self.xos_port.instance.self_content_type_id)
-
- address_pairs = []
- for tag in tags:
- si = ServiceInstance.objects.get(id = int(tag.value))
-
- # cast from Tenant to descendant class (VRouterTenant, etc)
- si = si.leaf_model
-
- if (not hasattr(si, "public_ip")) or (not hasattr(si, "public_mac")):
- raise Exception("Object %s does not have public_ip and/or public_mac fields" % si)
- address_pairs.append({"ip_address": si.public_ip,
- "mac_address": si.public_mac})
-
- return address_pairs
-
- def get_container_addresses(self):
- if not self.is_access_network():
- # If not an access network, do not apply any addresses
- return []
-
- if not self.xos_port.instance:
- return []
-
- addrs = []
- for si in ServiceInstance.objects.all():
- # cast from tenant to its descendant class (VSGTenant, etc)
- si = si.leaf_model
-
- if not hasattr(si, "instance_id"):
- # ignore ServiceInstance that don't have instances
- continue
-
- if si.instance_id != self.xos_port.instance.id:
- # ignore ServiceInstances that don't relate to our instance
- continue
-
- # Check to see if there is a link public address (aka VRouterTenant)
- links = si.subscribed_links.all()
- for link in links:
- # cast from ServiceInstance to descendant class (VRouterTenant, etc)
- pubaddr_si = link.provider_service_instance.leaf_model
- if hasattr(pubaddr_si, "public_ip") and hasattr(pubaddr_si, "public_mac"):
- addrs.append({"ip_address": pubaddr_si.public_ip,
- "mac_address": pubaddr_si.public_mac})
- return addrs
-
- @property
- def vlan_id(self):
- """ Return the vlan_id associated with this instance. This assumes the instance was tagged with either a
- vlan_id or s_tag tag.
- """
-
- if not self.is_access_network():
- # If not an access network, do not apply any tags
- return []
-
- if not self.xos_port.instance:
- return None
-
- tags = Tag.objects.filter(content_type=model_accessor.get_content_type_id(self.xos_port.instance),
- object_id=self.xos_port.instance.id,
- name="vlan_id")
-
- if not tags:
- # DEPRECATED
- # Historically, VSG instances are tagged with "s_tag" instead of "vlan_id"
- tags = Tag.objects.filter(content_type=model_accessor.get_content_type_id(self.xos_port.instance),
- object_id=self.xos_port.instance.id,
- name="s_tag")
-
- if not tags:
- return None
-
- return tags[0].value
-
- @property
- def floating_address_pairs(self):
- # Floating_address_pairs is the set of WAN addresses that should be
- # applied to this port.
-
- # We only want to apply these addresses to an "access" network.
-
-
- address_pairs = self.get_vm_addresses() + self.get_container_addresses()
-
- return address_pairs
-
- @property
- def id(self):
- return self.xos_port.port_id
-
- @property
- def name(self):
- return "port-%s" % self.xos_port.id
-
- @property
- def network_id(self):
- cn = self.get_controller_network()
- if not cn:
- return None
- return cn.net_id
-
- @property
- def network_name(self):
- return self.xos_port.network.name
-
- @property
- def mac_address(self):
- return self.xos_port.mac
-
- @property
- def ip_address(self):
- return self.xos_port.ip
-
- def to_dict(self):
- return {"id": self.id,
- "name": self.name,
- "network_id": self.network_id,
- "mac_address": self.mac_address,
- "ip_address": self.ip_address,
- "floating_address_pairs": self.floating_address_pairs,
- "vlan_id": self.vlan_id}
-
- def __eq__(self, other):
- return self.to_dict() == other.to_dict()
-
diff --git a/xos/templates/vtnadmin.html b/xos/templates/vtnadmin.html
deleted file mode 100644
index d9a5d75..0000000
--- a/xos/templates/vtnadmin.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-<!--
-Copyright 2017-present Open Networking Foundation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-
-<div class = "row text-center">
- <div class="col-xs-12">
- <a href="/admin/vtn/vnrtenant/">vTN Tenants</a>
- </div>
-</div>
diff --git a/xos/tosca/resources/vtnservice.py b/xos/tosca/resources/vtnservice.py
deleted file mode 100644
index 7c57f09..0000000
--- a/xos/tosca/resources/vtnservice.py
+++ /dev/null
@@ -1,23 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-from services.vtn.models import VTNService
-from service import XOSService
-
-class XOSVTNService(XOSService):
- provides = "tosca.nodes.VTNService"
- xos_model = VTNService
- copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "versionNumber", 'privateGatewayMac', 'localManagementIp', 'ovsdbPort', 'sshPort', 'sshUser', 'sshKeyFile', 'mgmtSubnetBits', 'xosEndpoint', 'xosUser', 'xosPassword', 'vtnAPIVersion', 'controllerPort']
diff --git a/xos/vtn-onboard.yaml b/xos/vtn-onboard.yaml
deleted file mode 100644
index 9cf0fea..0000000
--- a/xos/vtn-onboard.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-tosca_definitions_version: tosca_simple_yaml_1_0
-
-description: Onboard the exampleservice
-
-imports:
- - custom_types/xos.yaml
-
-topology_template:
- node_templates:
- servicecontroller#vtn:
- type: tosca.nodes.ServiceController
- properties:
- base_url: file:///opt/xos_services/vtn/xos/
- # The following will concatenate with base_url automatically, if
- # base_url is non-null.
- xproto: ./
- admin_template: templates/vtnadmin.html
- tosca_resource: tosca/resources/vtnservice.py
- #private_key: file:///opt/xos/key_import/vsg_rsa
- #public_key: file:///opt/xos/key_import/vsg_rsa.pub
-
diff --git a/xos/vtn.xproto b/xos/vtn.xproto
deleted file mode 100644
index 6be82da..0000000
--- a/xos/vtn.xproto
+++ /dev/null
@@ -1,20 +0,0 @@
-option kind = "VTN";
-option name = "vtn";
-
-message VTNService (Service){
- option verbose_name = "VTN Service";
-
- required string privateGatewayMac = 1 [default = "00:00:00:00:00:01", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
- required string localManagementIp = 2 [default = "172.27.0.1/24", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
- required int32 ovsdbPort = 3 [default = 6641, null = False, db_index = False, blank = False];
- required int32 sshPort = 4 [default = 22, null = False, db_index = False, blank = False];
- required string sshUser = 5 [default = "root", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
- required string sshKeyFile = 6 [default = "/root/node_key", max_length = 1024, content_type = "stripped", blank = False, null = False, db_index = False];
- required int32 mgmtSubnetBits = 7 [default = 24, null = False, db_index = False, blank = False];
- required string xosEndpoint = 8 [default = "http://xos/", max_length = 1024, content_type = "stripped", blank = False, null = False, db_index = False];
- required string xosUser = 9 [default = "padmin@vicci.org", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
- required string xosPassword = 10 [default = "letmein", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
- required int32 vtnAPIVersion = 11 [default = 1, null = False, db_index = False, blank = False];
- required string controllerPort = 12 [default = "onos-cord:6653", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
- required bool resync = 13 [default = False, null = False, db_index = False, blank = False];
-}