# osmo_gsm_tester: run_node: object holding information on a target env to run stuff.
#
# Copyright (C) 2020 by sysmocom - s.f.m.c. GmbH
#
# Author: Pau Espin Pedrol <pespin@sysmocom.de>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from ..core import log
from ..core import schema

def on_register_schemas():
    resource_schema = {
        'run_type': schema.STR,
        'run_addr': schema.IPV4,
        'ssh_user': schema.STR,
        'ssh_addr': schema.IPV4,
        }
    schema.register_resource_schema('run_node', resource_schema)


class RunNode(log.Origin):

    T_LOCAL = 'local'
    T_REM_SSH = 'ssh'

    def __init__(self, type=None, run_addr=None, ssh_user=None, ssh_addr=None):
        super().__init__(log.C_RUN, 'runnode')
        self._type = type
        self._run_addr = run_addr
        self._ssh_user = ssh_user
        self._ssh_addr = ssh_addr
        if not self._type:
            raise log.Error('run_type not set')
        if not self._run_addr:
            raise log.Error('run_addr not set')
        if self._type == RunNode.T_LOCAL and (self._ssh_user or self._ssh_addr):
            raise log.Error('run_type=%s but ssh info set' % RunNode.T_LOCAL)
        if self._type == RunNode.T_REM_SSH and not (self._ssh_user and self._ssh_addr):
            raise log.Error('run_type=%s but ssh info NOT set' % RunNode.T_LOCAL)

        if self._type == RunNode.T_LOCAL:
            self.set_name('run-' + self._run_addr)
        else:
            self.set_name('run-' + self._run_addr + "(" + self._ssh_user + '@' + self._ssh_addr + ")")

    @classmethod
    def from_conf(cls, conf):
        return cls(conf.get('run_type', None), conf.get('run_addr', None), conf.get('ssh_user', None), conf.get('ssh_addr', None))

    def is_local(self):
        return self._type == RunNode.T_LOCAL

    def __str__(self):
        return self.name()

    def run_type(self):
        return self._type

    def run_addr(self):
        return self._run_addr

    def ssh_user(self):
        return self._ssh_user

    def ssh_addr(self):
        return self._ssh_addr

# vim: expandtab tabstop=4 shiftwidth=4
