Add cloudtaf framework
[ta/cloudtaf.git] / libraries / cluster / hosts.py
diff --git a/libraries/cluster/hosts.py b/libraries/cluster/hosts.py
new file mode 100644 (file)
index 0000000..917f730
--- /dev/null
@@ -0,0 +1,152 @@
+# 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