[CORD-3057] Basic OSS Service implementation
Change-Id: Ieacda8b3e4518fb133e97baaab554356d4e6bc3c
diff --git a/xos/synchronizer/config.yaml b/xos/synchronizer/config.yaml
new file mode 100644
index 0000000..d85bf30
--- /dev/null
+++ b/xos/synchronizer/config.yaml
@@ -0,0 +1,45 @@
+
+# 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: hippie-oss
+accessor:
+ username: xosadmin@opencord.org
+ password: "@/opt/xos/services/hippie-oss/credentials/xosadmin@opencord.org"
+required_models:
+ - HippieOSSService
+ - HippieOSSServiceInstance
+ - RCORDSubscriber
+dependency_graph: "/opt/xos/synchronizers/hippie-oss/model-deps"
+model_policies_dir: "/opt/xos/synchronizers/hippie-oss/model_policies"
+models_dir: "/opt/xos/synchronizers/hippie-oss/models"
+steps_dir: "/opt/xos/synchronizers/hippie-oss/steps"
+
+logging:
+ version: 1
+ handlers:
+ console:
+ class: logging.StreamHandler
+ file:
+ class: logging.handlers.RotatingFileHandler
+ filename: /var/log/xos.log
+ maxBytes: 10485760
+ backupCount: 5
+ loggers:
+ 'multistructlog':
+ handlers:
+ - console
+ - file
+ level: DEBUG
diff --git a/xos/synchronizer/hippie-oss-synchronizer.py b/xos/synchronizer/hippie-oss-synchronizer.py
new file mode 100755
index 0000000..46f6219
--- /dev/null
+++ b/xos/synchronizer/hippie-oss-synchronizer.py
@@ -0,0 +1,32 @@
+
+# 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__)) + '/config.yaml')
+Config.init(config_file, 'synchronizer-config-schema.yaml')
+
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/new_base")
+sys.path.append(observer_path)
+mod = importlib.import_module("xos-synchronizer")
+mod.main()
diff --git a/xos/synchronizer/model-deps b/xos/synchronizer/model-deps
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/xos/synchronizer/model-deps
@@ -0,0 +1 @@
+{}
diff --git a/xos/synchronizer/model_policies/model_policy_hippieossserviceinstance.py b/xos/synchronizer/model_policies/model_policy_hippieossserviceinstance.py
new file mode 100644
index 0000000..543c0df
--- /dev/null
+++ b/xos/synchronizer/model_policies/model_policy_hippieossserviceinstance.py
@@ -0,0 +1,42 @@
+
+# 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 RCORDSubscriber, model_accessor
+from synchronizers.new_base.policy import Policy
+
+class OSSServiceInstancePolicy(Policy):
+ model_name = "HippieOSSServiceInstance"
+
+ def handle_update(self, si):
+ self.logger.debug("MODEL_POLICY: handle_update for HippieOSSServiceInstance %s " % si.id)
+ if not si.valid:
+ # NOTE we don't do anything if the ONU has not been activated
+ self.logger.debug("MODEL_POLICY: skipping handle_update for HippieOSSServiceInstance %s as valid is %s" % (si.id, si.valid))
+ pass
+ else:
+ self.logger.debug("MODEL_POLICY: creating RCORDSubscriber for HippieOSSServiceInstance %s as valid is %s" % (si.id, si.valid))
+ subscriber = RCORDSubscriber()
+ subscriber.onu_device = si.serial_number
+ subscriber.uni_port_id = si.uni_port_id
+
+ # If the OSS returns a c_tag use that one
+ if si.c_tag:
+ subscriber.c_tag = si.c_tag
+
+ subscriber.save()
+
+ def handle_delete(self, si):
+ pass
diff --git a/xos/synchronizer/models/convenience/hippieossservice.py b/xos/synchronizer/models/convenience/hippieossservice.py
new file mode 100644
index 0000000..356d1f2
--- /dev/null
+++ b/xos/synchronizer/models/convenience/hippieossservice.py
@@ -0,0 +1,48 @@
+
+# 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.
+
+
+# validate_onu received event:
+# {
+# 'status': 'activate',
+# 'serial_number': 'BRCM1234',
+# 'uni_port_id': 'of:00100101',
+# 'of_dpid': 'of:109299321'
+# }
+
+from xosapi.orm import ORMWrapper, register_convenience_wrapper
+from xosapi.convenience.serviceinstance import ORMWrapperServiceInstance
+
+import logging as log
+
+class ORMWrapperHippieOSSService(ORMWrapperServiceInstance):
+
+ def validate_onu(self, event):
+ log.info("validating ONU %s" % event["serial_number"])
+
+ # TODO check if a service instance for this serial_number already exists
+
+ # create an HippieOSSServiceInstance, the validation will be triggered in the corresponding sync step
+ oss_si = self.stub.HippieOSSServiceInstance(
+ serial_number=event["serial_number"],
+ uni_port_id=event["uni_port_id"],
+ of_dpid=event["of_dpid"]
+ )
+ oss_si.save()
+
+
+
+
+register_convenience_wrapper("HippieOSSService", ORMWrapperHippieOSSService)
diff --git a/xos/synchronizer/models/hippie-oss.xproto b/xos/synchronizer/models/hippie-oss.xproto
new file mode 100644
index 0000000..558d8b4
--- /dev/null
+++ b/xos/synchronizer/models/hippie-oss.xproto
@@ -0,0 +1,18 @@
+option name = "hippie-oss";
+option app_label = "hippie-oss";
+
+message HippieOSSService (Service){
+ option verbose_name = "HippieOSS Service";
+ option kind = "OSS";
+}
+
+message HippieOSSServiceInstance (ServiceInstance){
+ option owner_class_name = "HippieOSSService";
+ option verbose_name = "HippieOSS Service Instance";
+
+ required bool valid = 1 [help_text = "Wether this ONU has been validated by the external OSS", default = False, null = False, db_index = False, blank = False];
+ required string serial_number = 2 [max_length = 254, null = False, db_index = False, blank = False, tosca_key=True, unique = True];
+ required int32 uni_port_id = 3 [null = False, db_index = False, blank = False];
+ required string of_dpid = 4 [max_length = 254, null = False, db_index = False, blank = False];
+ optional int32 c_tag = 4 [null = True, db_index = False, blank = False, unique = True, feedback_state = True];
+}
\ No newline at end of file
diff --git a/xos/synchronizer/steps/sync_hippie_oss_service_instance.py b/xos/synchronizer/steps/sync_hippie_oss_service_instance.py
new file mode 100644
index 0000000..197e26c
--- /dev/null
+++ b/xos/synchronizer/steps/sync_hippie_oss_service_instance.py
@@ -0,0 +1,54 @@
+# 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 json
+from synchronizers.new_base.SyncInstanceUsingAnsible import SyncStep
+from synchronizers.new_base.modelaccessor import HippieOSSServiceInstance
+
+from xosconfig import Config
+from multistructlog import create_logger
+
+log = create_logger(Config().get('logging'))
+
+class SyncOSSServiceInstance(SyncStep):
+ provides = [HippieOSSServiceInstance]
+ observes = HippieOSSServiceInstance
+
+ def validate_in_external_oss(self, serial_number):
+ # This is where you may want to call your OSS Database to verify if this ONU can be activated
+ return True
+
+ def get_suscriber_c_tag(self, serial_number):
+ # If it's up to your OSS to generate c_tags, fetch them here
+ # otherwise XOS will generate one for your subscriber
+ return None
+
+ def sync_record(self, o):
+ log.info("synching HippieOSSServiceInstance", object=str(o), **o.tologdict())
+
+ if not self.validate_in_external_oss(o.serial_number):
+ log.error("ONU with serial number %s is not valid in the OSS Database")
+ return
+
+ if self.get_suscriber_c_tag(o.serial_number):
+ self.c_tag = self.get_suscriber_c_tag(o.serial_number)
+
+ o.valid = True
+
+ # FIXME why without this model_policies won't run the handle_update?
+ o.no_sync = True
+ o.save(always_update_timestamp=True)
+
+ def delete_record(self, o):
+ pass
diff --git a/xos/synchronizer/test_config.yaml b/xos/synchronizer/test_config.yaml
new file mode 100644
index 0000000..5a70d2d
--- /dev/null
+++ b/xos/synchronizer/test_config.yaml
@@ -0,0 +1,30 @@
+
+# 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: test-hippie-oss-config
+accessor:
+ username: xosadmin@opencord.org
+ password: "sample"
+ kind: "testframework"
+logging:
+ version: 1
+ handlers:
+ console:
+ class: logging.StreamHandler
+ loggers:
+ 'multistructlog':
+ handlers:
+ - console