fix package path and move files under doctor_tests
[doctor.git] / doctor_tests / installer / local.py
diff --git a/doctor_tests/installer/local.py b/doctor_tests/installer/local.py
new file mode 100644 (file)
index 0000000..7d0ae54
--- /dev/null
@@ -0,0 +1,109 @@
+##############################################################################
+# Copyright (c) 2017 ZTE Corporation and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import os
+import shutil
+import subprocess
+
+from doctor_tests.installer.base import BaseInstaller
+from doctor_tests.common.utils import load_json_file
+from doctor_tests.common.utils import write_json_file
+
+
+class LocalInstaller(BaseInstaller):
+    node_user_name = 'root'
+
+    nova_policy_file = '/etc/nova/policy.json'
+    nova_policy_file_backup = '%s%s' % (nova_policy_file, '.bak')
+
+    def __init__(self, conf, log):
+        super(LocalInstaller, self).__init__(conf, log)
+        self.policy_modified = False
+        self.add_policy_file = False
+
+    def setup(self):
+        self.get_ssh_key_from_installer()
+        self.set_apply_patches()
+
+    def cleanup(self):
+        self.restore_apply_patches()
+
+    def get_ssh_key_from_installer(self):
+        self.log.info('Assuming SSH keys already exchanged with computer for local installer type')
+        return None
+
+    def get_host_ip_from_hostname(self, hostname):
+        self.log.info('Get host ip from host name in local installer......')
+
+        cmd = "getent hosts %s | awk '{ print $1 }'" % (hostname)
+        server = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
+        stdout, stderr = server.communicate()
+        host_ip = stdout.strip()
+
+        self.log.info('Get host_ip:%s from host_name:%s in local installer' % (host_ip, hostname))
+        return host_ip
+
+    def set_apply_patches(self):
+        self._set_nova_policy()
+
+    def restore_apply_patches(self):
+        self._restore_nova_policy()
+
+    def _set_nova_policy(self):
+        host_status_policy = 'os_compute_api:servers:show:host_status'
+        host_status_rule = 'rule:admin_or_owner'
+        policy_data = {
+            'context_is_admin': 'role:admin',
+            'owner': 'user_id:%(user_id)s',
+            'admin_or_owner': 'rule:context_is_admin or rule:owner',
+            host_status_policy: host_status_rule
+        }
+
+        if os.path.isfile(self.nova_policy_file):
+            data = load_json_file(self.nova_policy_file)
+            if host_status_policy in data:
+                rule_origion = data[host_status_policy]
+                if host_status_rule == rule_origion:
+                    self.log.info('Do not need to modify nova policy.')
+                    self.policy_modified = False
+                else:
+                    # update the host_status_policy
+                    data[host_status_policy] = host_status_rule
+                    self.policy_modified = True
+            else:
+                # add the host_status_policy, if the admin_or_owner is not
+                # defined, add it also
+                for policy, rule in policy_data.items():
+                    if policy not in data:
+                        data[policy] = rule
+                self.policy_modified = True
+            if self.policy_modified:
+                self.log.info('Nova policy is Modified.')
+                shutil.copyfile(self.nova_policy_file,
+                                self.nova_policy_file_backup)
+        else:
+            # file does not exit, create a new one and add the policy
+            self.log.info('Nova policy file not exist. Creating a new one')
+            data = policy_data
+            self.add_policy_file = True
+
+        if self.policy_modified or self.add_policy_file:
+            write_json_file(self.nova_policy_file, data)
+            os.system('screen -S stack -p n-api -X stuff "^C^M^[[A^M"')
+
+    def _restore_nova_policy(self):
+        if self.policy_modified:
+            shutil.copyfile(self.nova_policy_file_backup, self.nova_policy_file)
+            os.remove(self.nova_policy_file_backup)
+        elif self.add_policy_file:
+            os.remove(self.nova_policy_file)
+
+        if self.add_policy_file or self.policy_modified:
+            os.system('screen -S stack -p n-api -X stuff "^C^M^[[A^M"')
+            self.add_policy_file = False
+            self.policy_modified = False