예제 #1
0
 def start_mesos_slave(self, virtual_zookeeper, agent_num):
     # create mesos slaves
     zk_address = 'zk://%s/mesos' % virtual_zookeeper
     print_okgreen('Step: creating virtual Mesos-slave with %s instance' %
                   agent_num)
     dynamic_env_slave = {
         self.config.get('mesos-slave').get('dynamic_env'): zk_address,
     }
     self.vcluster_config['job_info']['mesos-slave'] = (
         self.mesos_slave.setup(dynamic_env_slave, agent_num))
     print_okgreen('Mesos-slave created successfully.')
예제 #2
0
 def start_mesos_master(self, virtual_zookeeper):
     zk_address = 'zk://%s/mesos' % virtual_zookeeper
     print_okgreen('Step: creating virtual Mesos-master with 3 instance')
     dynamic_env_master = {
         self.config.get('mesos-master').get('dynamic_env'): zk_address,
     }
     mesos_count = int(
         self.config.get('mesos-master').get('instance_count'))
     self.vcluster_config['job_info']['mesos-master'] = (
         self.mesos_master.setup(dynamic_env_master, mesos_count))
     print_okgreen('Mesos-master created successfully.')
예제 #3
0
파일: vcluster.py 프로젝트: talaniz/peloton
 def start_mesos_slave(self, virtual_zookeeper, agent_num):
     # create mesos slaves
     zk_address = "zk://%s/mesos" % virtual_zookeeper
     print_okgreen("Step: creating virtual Mesos-slave with %s instance" %
                   agent_num)
     dynamic_env_slave = {
         self.config.get("mesos-slave").get("dynamic_env"): zk_address
     }
     self.vcluster_config["job_info"][
         "mesos-slave"] = self.mesos_slave.setup(dynamic_env_slave,
                                                 agent_num)
     print_okgreen("Mesos-slave created successfully.")
예제 #4
0
파일: vcluster.py 프로젝트: talaniz/peloton
 def start_mesos_master(self, virtual_zookeeper):
     zk_address = "zk://%s/mesos" % virtual_zookeeper
     print_okgreen("Step: creating virtual Mesos-master with 3 instance")
     dynamic_env_master = {
         self.config.get("mesos-master").get("dynamic_env"): zk_address
     }
     mesos_count = int(
         self.config.get("mesos-master").get("instance_count"))
     self.vcluster_config["job_info"][
         "mesos-master"] = self.mesos_master.setup(dynamic_env_master,
                                                   mesos_count)
     print_okgreen("Mesos-master created successfully.")
예제 #5
0
파일: vcluster.py 프로젝트: talaniz/peloton
 def start_cassandra(self):
     print_okgreen("Step: creating cassandra")
     cassandra_count = int(
         self.config.get("cassandra").get("instance_count"))
     keyspace = self.config.get("cassandra").get("keyspace", "vcluster")
     env = {"CASSANDRA_KEYSPACE": keyspace}
     self.vcluster_config["job_info"]["cassandra"] = self.cassandra.setup(
         env, cassandra_count)
     host, port = self.cassandra.get_host_port()
     self.vcluster_config["Cassandra"] = "%s:%s" % (host, port)
     print_okgreen("Created Cassandra store at %s:%s, keyspace %s" %
                   (host, port, keyspace))
     return host, port, keyspace
예제 #6
0
 def start_cassandra(self):
     print_okgreen('Step: creating cassandra')
     cassandra_count = int(
         self.config.get('cassandra').get('instance_count'))
     keyspace = self.config.get('cassandra').get('keyspace', 'vcluster')
     env = {'CASSANDRA_KEYSPACE': keyspace}
     self.vcluster_config['job_info']['cassandra'] = (self.cassandra.setup(
         env, cassandra_count))
     host, port = self.cassandra.get_host_port()
     self.vcluster_config["Cassandra"] = "%s:%s" % (host, port)
     print_okgreen('Created Cassandra store at %s:%s, keyspace %s' %
                   (host, port, keyspace))
     return host, port, keyspace
예제 #7
0
파일: vcluster.py 프로젝트: talaniz/peloton
    def teardown_peloton(self, remove=False):
        print_okgreen("Step: stopping all peloton applications")
        for app in reversed(self.APP_ORDER):
            print_okblue("Stopping peloton application: %s" % app)
            self.peloton.teardown(self.label_name + "_" + "peloton-" + app,
                                  remove=remove)

        print_okgreen("Step: stopping cassandra")
        self.cassandra.teardown(remove=remove)

        try:
            os.remove(self.config_name)
        except OSError:
            pass
예제 #8
0
    def start_mesos(self, agent_num):
        """
        param agent_num: Mesos-agent number of the virtual cluster
        type agent_num: int

        return host, port: zookeeper host, zookeeper port
        rtype host: str
        """
        # setup the VCluster on a physical Peloton cluster
        # create zookeeper
        print_okgreen("Step: creating virtual zookeeper with 1 instance")
        zookeeper_count = int(
            self.config.get("zookeeper").get("instance_count")
        )
        self.vcluster_config["job_info"]["zookeeper"] = self.zookeeper.setup(
            {}, zookeeper_count
        )

        # Get zookeeper tasks info
        host, port = self.zookeeper.get_host_port()
        if not host and port:
            raise Exception("Zookeeper launch failed")

        self.virtual_zookeeper = "%s:%s" % (host, port)

        zk_address = "zk://%s/mesos" % self.virtual_zookeeper
        print_okgreen("Zookeeper created successfully: %s" % zk_address)

        # create mesos master
        self.start_mesos_master(self.virtual_zookeeper)

        # create mesos slaves
        self.start_mesos_slave(self.virtual_zookeeper, agent_num)

        self.vcluster_config.update(
            {
                "Zookeeper": "%s:%s" % (host, port),
                "Mesos Slave Number": agent_num,
            }
        )
        return host, port
예제 #9
0
파일: vcluster.py 프로젝트: talaniz/peloton
    def teardown(self, remove=False):
        self.teardown_peloton(remove=remove)

        print_okgreen("Step: stopping all virtual Mesos-slaves")
        self.teardown_slave(remove=remove)

        print_okgreen("Step: stopping all virtual Mesos-master")
        self.mesos_master.teardown(remove=remove)

        print_okgreen("Step: stopping all virtual Zookeeper")
        self.zookeeper.teardown(remove=remove)
예제 #10
0
파일: vcluster.py 프로젝트: talaniz/peloton
    def start_peloton(
        self,
        virtual_zookeeper,
        agent_num,
        version=None,
        skip_respool=False,
        peloton_image=None,
        peloton_apps_config=None,
    ):
        """
        param virtual_zookeeper   : The zk url and port
        param agent_num           : The number of mesos agents to start
        param version             : The peloton version
        param skip_respool        : To skip creating the default respool or not
        param peloton_image       : The docker image of peloton
        param peloton_app_config  : The path to the peloton apps configs

        type virtual_zookeeper  : str
        type agent_num          : int
        type version            : str
        type skip_respool       : bool
        type peloton_image      : str
        type peloton_app_config : str
        """
        # Setup Cassandra
        chost, cport, keyspace = self.start_cassandra()
        # Wait a little for cassandra to start-up and create keyspace.
        # TODO(amitbose) find a better way to wait
        time.sleep(20)

        if peloton_image:
            parts = peloton_image.split(":")
            if len(parts) > 1:
                version = parts[-1]

        # Setup Peloton
        print_okgreen("Step: Create Peloton, version: %s, image: %s" %
                      (version, peloton_image))
        num_logs = self.config.get("peloton").get(
            "num_log_files", DEFAULT_PELOTON_NUM_LOG_FILES)

        for app in self.APP_ORDER:
            print_okblue("Creating peloton application: %s" % app)

            dynamic_env_master = {
                "PRODUCTION_CONFIG":
                self._get_base64_prod_config(app, peloton_apps_config),
                "APP":
                app,
                "ENVIRONMENT":
                "production",
                "ELECTION_ZK_SERVERS":
                virtual_zookeeper,
                "MESOS_ZK_PATH":
                "zk://%s/mesos" % virtual_zookeeper,
                "CASSANDRA_STORE":
                keyspace,
                "CASSANDRA_HOSTS":
                chost,
                "CASSANDRA_PORT":
                str(cport),
                "CONTAINER_LOGGER_LOGROTATE_STDERR_OPTIONS":
                "rotate %s" % num_logs,
            }
            mesos_slave_config = self.config.get("mesos-slave", {})
            mesos_work_dir = [
                kv["value"] for kv in mesos_slave_config.get("static_env", [])
                if kv.get("name") == "MESOS_WORK_DIR"
            ]
            if mesos_work_dir:
                dynamic_env_master["MESOS_AGENT_WORK_DIR"] = mesos_work_dir[0]

            if app == "hostmgr":
                dynamic_env_master["SCARCE_RESOURCE_TYPES"] = ",".join(
                    self.config.get("peloton").get(app).get(
                        "scarce_resource_types"))
                dynamic_env_master["SLACK_RESOURCE_TYPES"] = ",".join(
                    self.config.get("peloton").get(app).get(
                        "slack_resource_types"))
                dynamic_env_master["ENABLE_REVOCABLE_RESOURCES"] = str(
                    self.config.get("peloton").get(app).get(
                        "enable_revocable_resources"))
            if app == "placement_stateless":
                dynamic_env_master["APP"] = "placement"
                dynamic_env_master["TASK_TYPE"] = "STATELESS"

            peloton_app_count = int(
                self.config.get("peloton").get(app).get("instance_count"))
            self.vcluster_config["job_info"][app] = self.peloton.setup(
                dynamic_env_master,
                peloton_app_count,
                self.label_name + "_" + "peloton-" + app,
                version,
                peloton_image,
            )

        self.vcluster_config.update({"Peloton Version": version})

        # create a default resource pool
        if not skip_respool:
            create_respool_for_new_peloton(self.config,
                                           zk_server=virtual_zookeeper,
                                           agent_num=agent_num)
예제 #11
0
    def start_peloton(self,
                      virtual_zookeeper,
                      agent_num,
                      version=None,
                      skip_respool=False,
                      peloton_image=None,
                      peloton_apps_config=None):
        """
        param virtual_zookeeper   : The zk url and port
        param agent_num           : The number of mesos agents to start
        param version             : The peloton version
        param skip_respool        : To skip creating the default respool or not
        param peloton_image       : The docker image of peloton
        param peloton_app_config  : The path to the peloton apps configs

        type virtual_zookeeper  : str
        type agent_num          : int
        type version            : str
        type skip_respool       : bool
        type peloton_image      : str
        type peloton_app_config : str
        """
        # Setup Cassandra
        chost, cport, keyspace = self.start_cassandra()
        # Wait a little for cassandra to start-up and create keyspace.
        # TODO(amitbose) find a better way to wait
        time.sleep(20)

        if peloton_image:
            parts = peloton_image.split(':')
            if len(parts) > 1:
                version = parts[-1]

        # Setup Peloton
        print_okgreen('Step: Create Peloton, version: %s, image: %s' %
                      (version, peloton_image))
        num_logs = self.config.get('peloton').get(
            'num_log_files', DEFAULT_PELOTON_NUM_LOG_FILES)

        for app in self.APP_ORDER:
            print_okblue('Creating peloton application: %s' % app)

            # placement_[stateless|stateful] is the placement app with the a
            # different name
            if app.startswith('placement_'):
                app = 'placement'

            prod_config_path = self._get_app_path(peloton_apps_config). \
                format(app)
            with open(prod_config_path, "rb") as config_file:
                prod_config_base64 = base64.b64encode(config_file.read())

            dynamic_env_master = {
                "PRODUCTION_CONFIG":
                prod_config_base64,
                'APP':
                app,
                'ENVIRONMENT':
                'production',
                'ELECTION_ZK_SERVERS':
                virtual_zookeeper,
                'MESOS_ZK_PATH':
                'zk://%s/mesos' % virtual_zookeeper,
                'CASSANDRA_STORE':
                keyspace,
                'CASSANDRA_HOSTS':
                chost,
                'CASSANDRA_PORT':
                str(cport),
                'CONTAINER_LOGGER_LOGROTATE_STDERR_OPTIONS':
                'rotate %s' % num_logs,
            }
            mesos_slave_config = self.config.get('mesos-slave', {})
            mesos_work_dir = [
                kv['value'] for kv in mesos_slave_config.get('static_env', [])
                if kv.get('name') == 'MESOS_WORK_DIR'
            ]
            if mesos_work_dir:
                dynamic_env_master['MESOS_AGENT_WORK_DIR'] = mesos_work_dir[0]

            if app == 'hostmgr':
                dynamic_env_master['SCARCE_RESOURCE_TYPES'] = ','.join(
                    self.config.get('peloton').get(app).get(
                        'scarce_resource_types'))
                dynamic_env_master['SLACK_RESOURCE_TYPES'] = ','.join(
                    self.config.get('peloton').get(app).get(
                        'slack_resource_types'))
                dynamic_env_master['ENABLE_REVOCABLE_RESOURCES'] = \
                    str(self.config.get('peloton').get(app).get(
                        'enable_revocable_resources'))
            if app == "placement_stateless":
                dynamic_env_master['APP'] = 'placement'
                dynamic_env_master['TASK_TYPE'] = 'STATELESS'

            peloton_app_count = int(
                self.config.get('peloton').get(app).get('instance_count'))
            self.vcluster_config['job_info'][app] = (self.peloton.setup(
                dynamic_env_master,
                peloton_app_count,
                self.label_name + '_' + 'peloton-' + app,
                version,
                peloton_image,
            ))

        self.vcluster_config.update({
            'Peloton Version': version,
        })

        # create a default resource pool
        if not skip_respool:
            create_respool_for_new_peloton(
                self.config,
                zk_server=virtual_zookeeper,
                agent_num=agent_num,
            )