示例#1
0
    def __init__(self):
        """
		Constructor
		Args:
			available_servers(list)
		"""

        self.swarm_servers = parse_config('orchastrator.json')['swarm_servers']
        self.available_servers = parse_config(
            'orchastrator.json')['available_servers']
        self.apps_by_hosts = self.take_containers_by_hosts()
示例#2
0
	def __init__(self):
		"""
		Constructor
		"""
		# self.__user = kwargs.get('username')
		# self.__password = kwargs.get('password')
		self.__user = parse_config("orchastrator.json")["user"]
		self.__password = parse_config("orchastrator.json")["password"]
		self.__docker_client_api = docker.from_env()
		self.ssh_client = paramiko.client.SSHClient()
		self.host_ip = socket.gethostbyname(socket.gethostname())
示例#3
0
    def take_containers_by_hosts(self):

        names_by_hosts = {}
        for host in parse_config('orchastrator.json')['swarm_servers']:
            names_by_hosts[host] = dict(
                Counter(self.list_containers_by_host(host)))
        return names_by_hosts
示例#4
0
    def list_swarm_servers(self):
        """
		List the servers in the swarm
		Returns:
			self.swarm_servers(list)
		"""
        return parse_config("orchastrator.json")["swarm_servers"]
示例#5
0
    def list_available_servers(self):
        """
		List the available servers remain
		Returns:
			self.available_servers(list)
		"""
        return parse_config("orchastrator.json")["available_servers"]
示例#6
0
    def join_server_swarm(self, host_ip):
        """
		Join server to the swarm
		Args:
			host_ip(str)
		"""
        #####First way
        # self.ssh_client.connect(host_ip, username=self.user, password=self.password)
        # _, stdout, _ = self.ssh_client.exec_command('docker swarm join --token {} {}:2377'. \
        # 											format(self.__token, self.__master))
        # stdout = '\n'.join(map(lambda x: x.rstrip(), stdout.readlines()))
        # if re.search(r'This node joined a swarm as a worker', stdout, re.I|re.S):
        # 	self.remove_available_server(host_ip)
        # 	self.add_swarm_server(host_ip)
        # else:
        # 	return "Node {} can't be joined to the swarm".format(host_ip)

        #####Second way

        logger = Logger(filename="orchastrator",
                        logger_name="SwarmManagment join_server_swarm")
        docker_api = self.get_docker_api(host_ip)
        response = False
        try:
            response = docker_api.swarm.join(remote_addrs= \
                [parse_config("orchastrator.json")["master"]], \
                join_token = parse_config("orchastrator.json")["token"])
        except docker.errors.APIError as e:
            logger.info(
                "Exception handling swarm joining but config will be updated and corrected"
            )
            logger.clear_handler()
            self.remove_available_server(host_ip)
            self.add_swarm_server(host_ip)

        if response == True:
            logger.info(
                "Node {} was successfully joined to the swarm".format(host_ip))
            logger.clear_handler()
            self.remove_available_server(host_ip)
            self.add_swarm_server(host_ip)
        else:

            logger.error(
                "Node {} can't be joined to the swarm".format(host_ip))
            logger.clear_handler()
            return "Node {} can't be joined to the swarm".format(host_ip)
示例#7
0
    def __init__(self):
        """
		Constructor of swarm manager
		Args:
			available_servers(list)
			swarm_servers(list)
			user(str)
			password(str)
			master_node(str)
			token(str)
		"""
        self.ssh_client = paramiko.SSHClient()
        self.ssh_client.load_system_host_keys()
        # self.available_servers = kwargs.get('available_servers', [])
        # self.swarm_servers = kwargs.get('swarm_servers', [])
        # self.user = kwargs.get('user')
        # self.password = kwargs.get('password')
        # self.master_nodes = kwargs.get('master_nodes', [])
        # self.__master = kwargs.get('master', None)
        # self.__token = kwargs.get('token')

        self.available_servers = parse_config(
            "orchastrator.json")["available_servers"]
        self.swarm_servers = parse_config("orchastrator.json")["swarm_servers"]
        self.user = parse_config("orchastrator.json")["user"]
        self.password = parse_config("orchastrator.json")["password"]
        self.master_nodes = parse_config("orchastrator.json")["master_nodes"]
        self.__master = parse_config("orchastrator.json")["master"]
        self.__token = parse_config("orchastrator.json")["token"]
示例#8
0
    def __init__(self):
        """
		Constructor of Platform_Orchastration
		"""

        # self.available_servers = kwargs.get('available_servers', [])
        # self.swarm_servers = kwargs.get('swarm_servers', [])
        # self.master_nodes = kwargs.get('master_nodes', [])
        # self.__master = kwargs.get('master', None)
        # self.__token = kwargs.get('token')
        # self.__user = kwargs.get('username')
        # self.__password = kwargs.get('password')
        # self.__docker_client_api = docker.from_env()

        # self.stats_colector = StatsCollector()

        # self.swarm_manager = SwarmManagment(available_servers=self.available_servers,
        # 									swarm_servers=self.swarm_servers,
        # 									master_nodes=self.master_nodes,
        # 									master=self.__master,
        # 									token=self.__token,
        # 									user=self.__user,
        # 									password=self.__password
        # 									)

        self.available_servers = parse_config(
            "orchastrator.json")["available_servers"]
        self.swarm_servers = parse_config("orchastrator.json")["swarm_servers"]
        self.user = parse_config("orchastrator.json")["user"]
        self.password = parse_config("orchastrator.json")["password"]
        self.master_nodes = parse_config("orchastrator.json")["master_nodes"]
        self.__master = parse_config("orchastrator.json")["master"]
        self.__token = parse_config("orchastrator.json")["token"]
        self.__docker_client_api = docker.from_env()
        self.stats_colector = StatsCollector()

        self.swarm_manager = SwarmManagment()
示例#9
0
    def making_host_decision(self, application, decision, release_node=False):
        """
		Make decision on which host to run container
		Args:
			application(str)
			decision(str)
		Returns:
			host(str)
		"""
        logger = Logger(filename="orchastrator",
                        logger_name="DecisionMaker making_host_decision")
        swarm_manager = SwarmManagment()
        app_per_node = "{}_per_node".format(application)
        app_by_hosts = self.counting_app_by_host(application)
        if release_node:
            del (app_by_hosts[release_node])
        host_number = len(app_by_hosts.keys())
        if decision is 'up':
            application_number = 0
            for host in app_by_hosts.keys():
                if app_by_hosts[host][application] == 0:
                    return host
                else:
                    application_number += app_by_hosts[host][application]
            average_app_number = application_number / host_number
            # print("Average => {}".format(average_app_number))
            # print("Appp => {}".format(parse_config('orchastrator.json')[app_per_node]))
            logger.info("Aplication {} ||| Average => {}\tApp_per_node => {}". \
             format(application, average_app_number, parse_config('orchastrator.json')[app_per_node]))
            logger.clear_handler()
            ###logic for adding node to the swarm
            if average_app_number >= parse_config(
                    'orchastrator.json')[app_per_node]:
                if len(parse_config('orchastrator.json')
                       ['available_servers']) != 0:
                    new_server = parse_config(
                        'orchastrator.json')['available_servers'][0]
                    swarm_manager.join_server_swarm(host_ip=parse_config(
                        'orchastrator.json')['available_servers'][0])
                    return new_server
                else:
                    logger.critical("There are not any available servers should" \
                        "look at host stat to run on the lowest" \
                        "loaded host a container")
                    logger.clear_handler()
                    # print("There are not any available servers should  \
                    # 		look at host stat to run on the lowest  \
                    # 		loaded host  a container")

            ###logic for adding node to the swarm
            for host in app_by_hosts.keys():
                if app_by_hosts[host][application] < average_app_number and \
                 app_by_hosts[host][application] < parse_config('orchastrator.json')[app_per_node]:
                    return host
            for host in app_by_hosts.keys():
                return host
        elif decision is 'down':
            application_number = 0
            for host in app_by_hosts.keys():
                application_number += app_by_hosts[host][application]

            min_app = "{}_min".format(application)
            # print("Min_app => {}\t app_num {}".format(parse_config('orchastrator.json')[min_app], application_number))
            logger.warning("Application => {} ||| min_apps on platform=> {}\tcurrent app_num {}". \
             format(application, parse_config('orchastrator.json')[min_app], application_number))
            logger.clear_handler()
            if application_number == parse_config(
                    'orchastrator.json')[min_app]:
                return None

            average_app_number = application_number / host_number
            for host in app_by_hosts.keys():
                if app_by_hosts[host][application] > average_app_number and \
                 app_by_hosts[host][application] < parse_config('orchastrator.json')[app_per_node]:
                    return host
            for host in app_by_hosts.keys():
                return host
示例#10
0
    decision_maker = DecisionMaker()
    swarm_manager = SwarmManagment()
    container_manager = ContainerManagement()
    app_for_incremnting = None
    app_for_decrementing = None

    ####for admin request tool
    print(decision_maker.release_node('10.102.7.123'))

    ####for admin request tool

    ###Running container if minimum quota is not applied
    apps_count = decision_maker.calculating_app_on_hosts()
    for app in apps_count:
        min_app = "{}_min".format(app)
        while apps_count[app] < parse_config('orchastrator.json')[min_app]:
            print(
                "Running container from app {} because of minimum quota limitation"
                .format(app))
            host = decision_maker.making_host_decision(app, decision='up')
            container_manager.run_container(host_ip=host, application=app)
            ###new object to take the new platform configuration
            decision_maker = DecisionMaker()
            container_manager = ContainerManagement()
            ###new object to take the new platform configuration
            apps_count = decision_maker.calculating_app_on_hosts()
            time.sleep(10)
    ###Running container if minimum quota is not applied

    containers_stats = stats_collector.parsed_stats()
    print("Stats of containers are taken  => {}".format(containers_stats))