
# 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 sys
from synchronizers.new_base.syncstep import SyncStep
from synchronizers.new_base.modelaccessor import *
from xosconfig import Config
from multistructlog import create_logger

log = create_logger(Config().get('logging'))

class SyncVEpcServiceInstance(SyncStep):

    provides = [VEpcServiceInstance]

    observes = VEpcServiceInstance

    requested_interval = 0

    # template_name = "vepcserviceinstance_playbook.yaml"

    # service_key_name = "/opt/xos/synchronizers/vepcservicenew/vepcservice_private_key"

    def __init__(self, *args, **kwargs):
        super(SyncVEpcServiceInstance, self).__init__(*args, **kwargs)

    def sync_record(self, o):
        # There's nothing to do at this time. Configuration of VEpcServiceInstance is handled by Kubernetes
        # through config maps, and that all happens in the model policy.
        #
        # TODO(smbaker): Consider deleting this sync step
        # Note from Gopi: This method exists as the code is copied from Simple Example Service. Please
        # discuss with smbaker if this function is necessary.
        pass
