Exemplo n.º 1
0
#! /usr/bin/python
'''
 Copyright (C) 2019 Maged Mokhtar <mmokhtar <at> petasan.org>
 Copyright (C) 2019 PetaSAN www.petasan.org


 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU Affero General Public License
 as published by the Free Software Foundation

 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 Affero General Public License for more details.
'''

import json
from PetaSAN.core.cluster.ntp import NTPConf

ntp = NTPConf()
server = ntp.get_ntp_server_local()
remote_ret = {}
remote_ret['success'] = True
remote_ret['ntp_server'] = server
print json.dumps(remote_ret)
Exemplo n.º 2
0
#! /usr/bin/python
'''
 Copyright (C) 2019 Maged Mokhtar <mmokhtar <at> petasan.org>
 Copyright (C) 2019 PetaSAN www.petasan.org


 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU Affero General Public License
 as published by the Free Software Foundation

 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 Affero General Public License for more details.
'''

from PetaSAN.core.cluster.ntp import NTPConf
from PetaSAN.core.cluster.job_manager import JobManager

ntp = NTPConf()
ntp.sync_hw_clock()

JobManager().remove_jobs_since(3600)
Exemplo n.º 3
0
def startup_services(building_stage=False, cluster_complete=False):
    path = ConfigAPI().get_service_files_path()

    if not building_stage and cluster_complete:
        logger.info("Start settings IPs")
        call_cmd('python ' + ConfigAPI().get_node_start_ips_script_path())

        call_cmd('systemctl start ntp')
        call_cmd('systemctl start petasan-mount-sharedfs')
        NTPConf().force_ntp_sync()
        JobManager().remove_jobs_since(0)

        if cluster_config.get_node_info().is_management:
            call_cmd('python ' + ConfigAPI().get_consul_start_up_script_path())
            call_cmd('systemctl start glusterd')
            call_cmd('systemctl start petasan-cluster-leader')
        else:
            call_cmd('python ' +
                     ConfigAPI().get_consul_client_start_up_script_path())

        logger.info("Starting cluster file sync service")
        call_cmd('systemctl start petasan-file-sync')

        call_cmd('/opt/petasan/scripts/load_iscsi_mods.sh')
        if cluster_config.get_node_info().is_iscsi:
            logger.info("Starting iSCSI Service")
            call_cmd('systemctl start petasan-iscsi')

        if cluster_config.get_node_info().is_management:
            logger.info("Starting Cluster Management application")
            call_cmd('systemctl start petasan-admin')
            # create Ceph manager if not already created
            # exec_command('python /opt/petasan/scripts/create_mgr.py 60 >/dev/null 2>&1 &')

        logger.info("Starting Node Stats Service")
        call_cmd('systemctl start petasan-node-stats')

        # activate PetaSAN custom vgs
        cm = CacheManager()
        cm.activate()

        # remove any unused ceph-volume services
        ceph_disk_lib.delete_unused_ceph_volume_services()

        logger.info("Starting OSDs")
        call_cmd('systemctl restart petasan-start-osds')

        if cluster_config.get_node_info().is_backup:
            logger.info('Starting sync replication node service')
            call_cmd('systemctl restart petasan-sync-replication-node')

        if cluster_config.get_node_info(
        ).is_iscsi or cluster_config.get_node_info().is_storage:
            logger.info("Starting petasan tuning service")
            call_cmd("systemctl restart petasan-tuning &")

    elif building_stage:

        call_cmd('systemctl start petasan-mount-sharedfs')
        if cluster_config.get_node_info().is_management:
            call_cmd('systemctl start petasan-cluster-leader')

        logger.info("Starting cluster file sync service")
        call_cmd('systemctl start petasan-file-sync')

        # replace node
        if cluster_config.get_node_info().is_backup:
            logger.info("Replace cluster node sync service")
            call_cmd('systemctl start petasan-sync-replication-node')
        # end

        call_cmd('/opt/petasan/scripts/load_iscsi_mods.sh')
        if cluster_config.get_node_info().is_iscsi:
            logger.info("Starting PetaSAN service")
            call_cmd('systemctl start petasan-iscsi')
            sleep(2)

        if cluster_config.get_node_info().is_management:
            logger.info("Starting Cluster Management application")
            call_cmd('systemctl start petasan-admin')

        # activate PetaSAN custom vgs
        cm = CacheManager()
        cm.activate()

        # remove any unused ceph-volume services
        ceph_disk_lib.delete_unused_ceph_volume_services()

        logger.info("Starting Node Stats Service")
        call_cmd('systemctl start petasan-node-stats')

        logger.info("Starting OSDs")
        call_cmd('systemctl restart petasan-start-osds')

        if cluster_config.get_node_info(
        ).is_iscsi or cluster_config.get_node_info().is_storage:
            logger.info("Starting petasan tuning service")
            call_cmd("systemctl restart petasan-tuning &")

    elif not building_stage and not cluster_complete:
        logger.info("Start settings IPs")
        call_cmd('python ' + ConfigAPI().get_node_start_ips_script_path())
Exemplo n.º 4
0
#! /usr/bin/python
'''
 Copyright (C) 2019 Maged Mokhtar <mmokhtar <at> petasan.org>
 Copyright (C) 2019 PetaSAN www.petasan.org


 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU Affero General Public License
 as published by the Free Software Foundation

 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 Affero General Public License for more details.
'''

import sys
from PetaSAN.core.cluster.ntp import NTPConf

if len(sys.argv) != 2:
    print 'usage: set_ntp_server  server_name'
    sys.exit(1)

server = sys.argv[1]
ntp = NTPConf()
ntp.set_ntp_server_local(server)
sys.exit(0)
Exemplo n.º 5
0
    def build(self):
        try:
            self.__status_report = StatusReport()
            conf = configuration()

            if len(conf.get_cluster_info().management_nodes) == 0:
                node_num = len(conf.get_cluster_info().management_nodes) + 1
                self.__status_report.nod_num = node_num
                NTPConf().setup_ntp_local()
                if conf.add_management_node() != Status().done:
                    self.__status_report.success = False
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_cant_add_node")

                logger.info(
                    "Node 1 added, cluster requires 2 other nodes to build.")
                self.run_post_deploy_script()
                return BuildStatus().OneManagementNode

            elif len(conf.get_cluster_info().management_nodes) == 1:
                node_num = len(conf.get_cluster_info().management_nodes) + 1
                self.__status_report.nod_num = node_num

                connection_status = self.check_connections()
                if not connection_status.success:
                    self.__status_report.failed_tasks.extend(
                        connection_status.failed_tasks)
                    logger.error("Connection ping error.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().connection_error

                NTPConf().setup_ntp_local()

                if conf.add_management_node() != Status().done:
                    self.__status_report.success = False
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_cant_add_node")
                    return BuildStatus().error
                if not self.__sync_cluster_config_file():
                    return BuildStatus().error

                logger.info(
                    "Node 2 is added, cluster requires 1 other node to build.")
                self.run_post_deploy_script()
                return BuildStatus().TwoManagementNodes

            elif len(conf.get_cluster_info().management_nodes) == 2:
                node_num = len(conf.get_cluster_info().management_nodes) + 1
                self.__status_report.nod_num = node_num

                connection_status = self.check_connections()
                if not connection_status.success:
                    self.__status_report.failed_tasks.extend(
                        connection_status.failed_tasks)
                    logger.error("Connection ping error.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().connection_error

                status = self.check_remote_connection()
                if not status.success:
                    self.__status_report = status
                    return BuildStatus().error

                NTPConf().setup_ntp_local()

                logger.info("Stopping petasan services on all nodes.")
                self.stop_petasan_services()
                logger.info("Starting local clean_ceph.")
                clean_ceph()
                logger.info("Starting local clean_consul.")
                clean_consul()

                status = build_consul()
                if not status.success:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)
                    logger.error("Could not build consul.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_consul_error

                status = build_monitors()
                if not status.success:
                    self.__status_report = status
                    logger.error("Could not build ceph monitors.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_monitors_error

                status = build_osds()
                if not status.success:
                    self.__status_report = status
                    logger.error("Could not build ceph OSDs.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_osd_error
                else:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)

                logger.info("Main core components deployed.")

                if not self.__commit_management_nodes():
                    self.__status_report.success = False
                    logger.error("Could not commit node.")
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_couldnt_commit_node")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().error

                logger.info("Starting all services.")
                self.start_petasan_services()

                if not self.add__node_to_hosts_file():
                    self.__status_report.success = False
                    logger.error("Could not add node to hosts file.")
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_couldnt_add_node_hosts")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().error

                SharedFS().setup_management_nodes()

                if conf.add_management_node() != Status().done:
                    self.__status_report.success = False
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_couldnt_add_node_config")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().error

                logger.info("Updating rbd pool.")
                if not create_rbd_pool():
                    self.__status_report.success = False
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_couldnt_update_rbd")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().error

                logger.info("Creating EC Profiles.")
                if not create_ec_profiles():
                    self.__status_report.success = False
                    self.__status_report.failed_tasks.append(
                        "core_cluster_deploy_couldnt_create_ec_profiles")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().error

                logger.info(
                    "Waiting for ceph to reach active and clean status.")
                test_active_clean()
                if not self.__sync_cluster_config_file():
                    return BuildStatus().error

                self.run_post_deploy_script()
                self.kill_petasan_console(True)
                logger.info("Node 3 added and cluster is now ready.")

            elif len(
                    conf.get_cluster_info().management_nodes
            ) == 3 and not os.path.exists(ConfigAPI().get_replace_file_path()):
                # ------------------------------ Join ------------------------------ #
                # ------------------------------------------------------------------ #
                node_num = len(conf.get_cluster_info().management_nodes) + 1
                self.__status_report.nod_num = node_num
                logger.info("Joining node to running cluster.")

                connection_status = self.check_connections()
                if not connection_status.success:
                    self.__status_report.failed_tasks.extend(
                        connection_status.failed_tasks)
                    logger.error("Connection ping error.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().connection_error

                status = self.check_remote_connection()
                NTPConf().setup_ntp_local()

                if not status.success:
                    self.__status_report = status
                    return BuildStatus().error

                logger.info("Stopping petasan services on local node.")
                self.stop_petasan_services(remote=False)
                logger.info("Starting local clean_ceph.")
                clean_ceph_local()
                logger.info("Starting local clean_consul.")
                clean_consul_local()

                status = build_consul_client()
                if not status.success:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)
                    logger.error("Could not build consul client.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_consul_error

                status = copy_ceph_config_from_mon()
                if not status.success:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)
                    logger.error("Could not copy ceph config.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_consul_error

                status = create_osds_local()
                if not status.success:
                    self.__status_report = status
                    logger.error("Could not build ceph OSDs.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_osd_error
                else:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)

                logger.info("Main core components deployed.")
                logger.info("Staring all services")
                self.start_petasan_services(remote=False)
                test_active_clean()
                if not self.__commit_local_node():
                    test_active_clean()
                    if not self.__commit_local_node():
                        self.__status_report.success = False
                        logger.error("Could not commit node.")
                        self.__status_report.failed_tasks.append(
                            "core_cluster_deploy_couldnt_commit_node_join")
                        logger.error(self.__status_report.failed_tasks)
                        os.remove(ConfigAPI().get_cluster_info_file_path())
                        return BuildStatus().error

                if not self.add__node_to_hosts_file(remote=False):
                    test_active_clean()
                    if not self.add__node_to_hosts_file(remote=False):
                        self.__status_report.success = False
                        logger.error("Could not add node to hosts file.")
                        self.__status_report.failed_tasks.append(
                            "core_cluster_deploy_couldnt_add_node_hosts")
                        logger.error(self.__status_report.failed_tasks)
                        os.remove(ConfigAPI().get_cluster_info_file_path())
                        return BuildStatus().error

                logger.info("Node successfully joined to cluster.")
                self.kill_petasan_console(False)
                if os.path.exists(ConfigAPI().get_replace_file_path()):
                    os.remove(ConfigAPI().get_replace_file_path())

                self.run_post_deploy_script()
                return BuildStatus().done_joined

            elif len(conf.get_cluster_info().management_nodes
                     ) == 3 and os.path.exists(
                         ConfigAPI().get_replace_file_path()):
                # ----------------------------- Replace ---------------------------- #
                # ------------------------------------------------------------------ #
                node_num = len(conf.get_cluster_info().management_nodes) + 1
                self.__status_report.nod_num = node_num
                logger.info("Replace node is starting.")

                connection_status = self.check_connections()
                if not connection_status.success:
                    self.__status_report.failed_tasks.extend(
                        connection_status.failed_tasks)
                    logger.error("Connection ping error.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().connection_error

                status = self.check_remote_connection()
                NTPConf().setup_ntp_local()

                if not status.success:
                    self.__status_report = status
                    return BuildStatus().error

                logger.info("Stopping petasan services on local node.")
                self.stop_petasan_services(remote=False)
                logger.info("Starting clean_ceph.")
                clean_ceph_local()
                logger.info("Starting local clean_consul.")
                clean_consul_local()

                status = replace_consul_leader()
                if not status.success:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)
                    logger.error("Could not replace consul leader.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_consul_error

                status = replace_local_monitor()
                if not status.success:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_monitors_error

                status = create_osds_local()
                if not status.success:
                    self.__status_report = status
                    logger.error("Could not build ceph OSDs.")
                    logger.error(self.__status_report.failed_tasks)
                    return BuildStatus().build_osd_error
                else:
                    self.__status_report.failed_tasks.extend(
                        status.failed_tasks)

                logger.info("Main core components deployed.")
                logger.info("Starting all services.")
                self.start_petasan_services(remote=False)
                test_active_clean()

                SharedFS().rebuild_management_node()

                logger.info("Node successfully added to cluster.")
                self.run_post_deploy_script()
                self.kill_petasan_console(False)
                os.remove(ConfigAPI().get_replace_file_path())
                return BuildStatus().done_replace

        except Exception as ex:
            config_api = ConfigAPI()
            if os.path.exists(config_api.get_cluster_info_file_path()):
                os.remove(config_api.get_cluster_info_file_path())
            logger.exception(ex.message)
            return BuildStatus().error

        return BuildStatus().done
Exemplo n.º 6
0
 def save_ntp_server(self, ntp_server):
     ntp = NTPConf()
     return ntp.set_ntp_server_remote(ntp_server)
Exemplo n.º 7
0
 def get_ntp_server(self):
     ntp = NTPConf()
     return ntp.get_ntp_server_remote()