예제 #1
0
def submission_visualizer(submission_id):
    """ Gets the visualizer url of a specific job.
    Raises:
        ex.BadRequestException -- Trying to search info about a job that
        has never being submitted in this Asperathos instance.
    Returns:
        dict -- Returns a dict with 'visualizer_url' as key and the url
            that gives access to the visualizer platform as value.
    """
    if submission_id not in submissions:
        API_LOG.log("Wrong request")
        raise ex.BadRequestException()

    visualizer_url = ""

    # Check if the visualizer is active in this Asperathos instance
    # If true, call visualizer API to return the visualizer URL
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    address = api.visualizer_url.split('/')[-1]
    ip = address.split(':')[0]
    port = int(address.split(':')[1])
    result = sock.connect_ex((ip, port))

    if result == 0:
        API_LOG.log("Visualizing Running on port %s" % port)
        visualizer_url = visualizer.get_visualizer_url(api.visualizer_url,
                                                       submission_id)
    else:
        API_LOG.log("There is no process running in the Visualizer address")
        raise ex.BadRequestException("There is no process running \
                                     in the Visualizer address")

    return {"visualizer_url": visualizer_url}
예제 #2
0
    def start_visualization(self, data):
        self.enable_visualizer = data['enable_visualizer']
        if self.enable_visualizer:
            visualizer.start_visualization(api.visualizer_url, self.app_id,
                                           data['visualizer_info'])

            self.visualizer_url = visualizer.get_visualizer_url(
                api.visualizer_url, self.app_id)

            KUBEJOBS_LOG.log("Dashboard of the job created on: %s" %
                             (self.visualizer_url))
예제 #3
0
    def start_application(self, data):
        try:

            # Download files that contains the items
            jobs = requests.get(data['redis_workload']).text.\
                                split('\n')[:-1]

            # Provision a redis database for the job. Die in case of error.
            # TODO(clenimar): configure ``timeout`` via a request param,
            # e.g. api.redis_creation_timeout.
            redis_ip, redis_port = self.k8s.provision_redis_or_die(self.app_id)
            #agent_port = k8s.create_cpu_agent(self.app_id)

            # inject REDIS_HOST in the environment
            data['env_vars']['REDIS_HOST'] = 'redis-%s' % self.app_id

            # inject SCONE_CONFIG_ID in the environment
            # FIXME: make SCONE_CONFIG_ID optional in submission
            data['env_vars']['SCONE_CONFIG_ID'] = data['config_id']

            # create a new Redis client and fill the work queue
            if (self.rds == None):
                self.rds = redis.StrictRedis(host=redis_ip, port=redis_port)

            queue_size = len(jobs)

            # Check if a visualizer will be created
            self.enable_visualizer = data['enable_visualizer']

            # Create all visualizer components
            if self.enable_visualizer:
                # Specify the datasource to be used in the visualization
                datasource_type = data['visualizer_info']['datasource_type']

                if datasource_type == "influxdb":
                    database_data = k8s.create_influxdb(self.app_id)
                    #TODO {javan} change name of redis_ip to node_ip in configuration file
                    database_data.update({"url": api.redis_ip})
                    data['monitor_info'].update(
                        {'database_data': database_data})
                    data['visualizer_info'].update(
                        {'database_data': database_data})

                data['monitor_info'].update(
                    {'datasource_type': datasource_type})

                print "Creating Visualization plataform"

                data['visualizer_info'].update({
                    'enable_visualizer':
                    data['enable_visualizer'],
                    'plugin':
                    data['monitor_plugin'],
                    'visualizer_plugin':
                    data['visualizer_plugin'],
                    'username':
                    data['username'],
                    'password':
                    data['password']
                })

                visualizer.start_visualization(api.visualizer_url, self.app_id,
                                               data['visualizer_info'])

                self.visualizer_url = visualizer.get_visualizer_url(
                    api.visualizer_url, self.app_id)

                print "Dashboard of the job created on: %s" % (
                    self.visualizer_url)

            print "Creating Redis queue"
            for job in jobs:
                self.rds.rpush("job", job)

            print "Creating Job"

            self.k8s.create_job(self.app_id,
                                data['cmd'],
                                data['img'],
                                data['init_size'],
                                data['env_vars'],
                                config_id=data["config_id"])

            starting_time = datetime.datetime.now().\
                strftime('%Y-%m-%dT%H:%M:%S.%fGMT')

            # Starting monitor
            data['monitor_info'].update({
                'count_jobs_url':
                api.count_queue,
                'number_of_jobs':
                queue_size,
                'submission_time':
                starting_time,
                'redis_ip':
                redis_ip,
                'redis_port':
                redis_port,
                'enable_visualizer':
                self.enable_visualizer
            })  #,
            #'cpu_agent_port': agent_port})

            monitor.start_monitor(api.monitor_url, self.app_id,
                                  data['monitor_plugin'], data['monitor_info'],
                                  2)

            # Starting controller
            data.update({'redis_ip': redis_ip, 'redis_port': redis_port})
            controller.start_controller_k8s(api.controller_url, self.app_id,
                                            data)

            while not self.job_completed and not self.terminated:
                self.update_application_state("ongoing")
                self.job_completed = self.k8s.completed(self.app_id)
                time.sleep(1)

            # Stop monitor, controller and visualizer

            if (self.get_application_state() == "ongoing"):
                self.update_application_state("completed")

            print "Job finished"

            time.sleep(float(30))

            if self.enable_visualizer:
                visualizer.stop_visualization(api.visualizer_url, self.app_id,
                                              data['visualizer_info'])
            monitor.stop_monitor(api.monitor_url, self.app_id)
            controller.stop_controller(api.controller_url, self.app_id)
            print "Stoped services"

            # delete redis resources
            if not self.get_application_state() == 'terminated':
                self.k8s.delete_redis_resources(self.app_id)

        except Exception as ex:
            self.update_application_state("error")
            print "ERROR: %s" % ex

        print "Application finished."