diff --git a/slapos/grid/promise/__init__.py b/slapos/grid/promise/__init__.py index d699b8dcd7975f7a0254c512ba302fb86e7311fa..7db5dc590815983f4835a7fb5b7ea545eb4aaaf8 100644 --- a/slapos/grid/promise/__init__.py +++ b/slapos/grid/promise/__init__.py @@ -389,10 +389,53 @@ class PromiseLauncher(object): json.dump(result.serialize(), outputfile) os.rename(promise_tmp_file, promise_output_file) + def _saveGlobalState(self, state_dict, config, report_date, success, error): + promise_status_file = os.path.join(self.partition_folder, + PROMISE_STATE_FOLDER_NAME, + 'promise_status.json') + global_file = os.path.join(self.partition_folder, + PROMISE_STATE_FOLDER_NAME, + 'global.json') + public_file = os.path.join(self.partition_folder, + PROMISE_STATE_FOLDER_NAME, + 'public.json') + global_state_dict = dict( + status="ERROR" if error else "OK", + state={"error": error, "success": success}, + type='global', + portal_type='Software Instance', + title='Instance Monitoring', + date=report_date, + _links={}, # To be filled by the instance + data={'state': 'monitor_state.data', + 'process_state': 'monitor_process_resource.status', + 'process_resource': 'monitor_resource_process.data', + 'memory_resource': 'monitor_resource_memory.data', + 'io_resource': 'monitor_resource_io.data', + 'monitor_process_state': 'monitor_resource.status'}, + aggregate_reference=config.get('computer-id'), + partition_id=config.get('partition-id') + ) + + public_state_dict = dict( + status=global_state_dict["status"], + date=report_date, + _links={} + ) + with open(promise_status_file, "w") as f: + json.dump(state_dict, f) + + with open(global_file, "w") as f: + json.dump(global_state_dict, f) + + with open(public_file, "w") as f: + json.dump(public_state_dict, f) + def _savePromiseHistoryResult(self, result): state_dict = result.serialize() previous_state_dict = {} - promise_status_file = os.path.join(PROMISE_STATE_FOLDER_NAME, + promise_status_file = os.path.join(self.partition_folder, + PROMISE_STATE_FOLDER_NAME, 'promise_status.json') if os.path.exists(promise_status_file): @@ -417,11 +460,9 @@ class PromiseLauncher(object): if not os.path.exists(history_file) or not os.stat(history_file).st_size: with open(history_file, 'w') as f: - data_dict = { - "date": time.time(), - "data": [state_dict] - } - json.dump(data_dict, f) + f.write("""{ + "date": %s, + "data": %s}""" % (time.time(), json.dumps([state_dict]))) else: previous_state_list = previous_state_dict.get(result.name, None) if previous_state_list is not None: @@ -443,11 +484,9 @@ class PromiseLauncher(object): # csv-like document for success/error statictics if not os.path.exists(stat_file_path) or os.stat(stat_file_path).st_size == 0: with open(stat_file_path, 'w') as fstat: - data_dict = { - "date": time.time(), - "data": ["Date, Success, Error, Warning"] - } - fstat.write(json.dumps(data_dict)) + fstat.write("""{ + "date": %s, + "data": ["Date, Success, Error, Warning"]}""" % time.time()) current_state = '%s, %s, %s, %s' % ( date, @@ -705,7 +744,6 @@ class PromiseLauncher(object): 'path': promise_path, 'name': promise_name } - config.update(base_config) promise_result = self._launchPromise(promise_name, promise_path, config) if promise_result: @@ -792,13 +830,12 @@ class PromiseLauncher(object): self._updateFolderOwner(self.promise_output_dir) - # Save Global State - with open(promise_status_file, "w") as f: - json.dump(new_state_dict, f) - self._saveStatisticsData(promise_stats_file, report_date, success, error) + self._saveGlobalState(new_state_dict, base_config, report_date, + success, error) + if self._skipped_amount > 0: self.logger.info("%s promises didn't need to be checked." % \ self._skipped_amount)