--- /dev/null
+# Copyright 2019 Nokia
+#
+# 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 abc
+from collections import namedtuple
+import six
+
+
+STORAGE = 'storage'
+
+
+class Profiles(object):
+ _master = None
+ _worker = None
+
+ @classmethod
+ def set_profiles(cls, master, worker):
+ cls._master = master
+ cls._worker = worker
+
+ @property
+ def master(self):
+ return self._master
+
+ @property
+ def worker(self):
+ return self._worker
+
+ @property
+ def storage(self):
+ return STORAGE
+
+ @property
+ def profiles_mask(self):
+ return set([self.master, self.worker, self.storage])
+
+
+class MgmtTarget(namedtuple('MgmtTarget', ['host', 'user', 'password'])):
+ """Container for the cloudtaf2 management VIP target attributes.
+
+ Arguments:
+ host: IP address or FQDN of the host management VIP
+ user: Username, e.g. cloudadmin for login
+ password: Login password
+
+ Example:
+
+ Library cluster.cluster.MgmtTarget
+ ... host=1.2.3.4
+ ... user=cloudadmin
+ ... password=good_password
+ """
+
+ def asdict(self):
+ return self._asdict()
+
+
+@six.add_metaclass(abc.ABCMeta)
+class HostBase(object):
+ """Container base for Host attributes.
+
+ Attributes:
+ name: name of the host
+ service_profiles: list of service profiles like ['master', 'worker']
+ shelldicts: list of dictionaries to RemoteSession.set_runner_target
+ """
+ def __init__(self, host_config):
+ self._host_config = host_config
+
+ @property
+ def is_dpdk(self):
+ """Return True if dpdk is used in provider network interfaces.
+ In more detail, is True if and only if one of the network profiles has
+ at least one interface with type *ovs-dpdk*.
+ """
+ return self._host_config.is_dpdk
+
+ @property
+ def name(self):
+ return self._host_config.name
+
+ @property
+ def service_profiles(self):
+ return self._host_config.service_profiles
+
+ @property
+ def network_domain(self):
+ return self._host_config.network_domain
+
+ @abc.abstractproperty
+ def shelldicts(self):
+ """Return *shelldicts* for :class:`crl.remotesession.remotesession`.
+ """
+
+ @property
+ def _host_dict(self):
+ return {'host': self._infra['ip'],
+ 'user': self._host_config.mgmt_target.user,
+ 'password': self._host_config.mgmt_target.password}
+
+ @property
+ def _infra(self):
+ return self._host_config.networking['infra_{}'.format(self._infra_type)]
+
+ @abc.abstractproperty
+ def _infra_type(self):
+ """Return any infra type e.g. 'internal', 'external' etc.
+ """
+
+
+class Master(HostBase):
+ @property
+ def shelldicts(self):
+ return [self._host_dict]
+
+ @property
+ def _infra_type(self):
+ return 'external'
+
+ @property
+ def external_ip(self):
+ return self._infra['ip']
+
+
+class NonMaster(HostBase):
+ @property
+ def shelldicts(self):
+ return [self._host_config.mgmt_target.asdict(), self._host_dict]
+
+ @property
+ def _infra_type(self):
+ return 'internal'
+
+
+class HostConfig(namedtuple('HostConfig', ['name',
+ 'network_domain',
+ 'service_profiles',
+ 'networking',
+ 'mgmt_target',
+ 'is_dpdk'])):
+ pass