diff --git a/inventory.py b/inventory.py new file mode 100644 index 0000000..0b831b6 --- /dev/null +++ b/inventory.py @@ -0,0 +1,106 @@ +# encoding: utf-8 +import sys +import os +import re +import datetime +import numpy as np + +from SimpaDbUtil import SqlDatabaseReader, SqlFile + +class Inventory( object ): + def __init__(self, sql_reader): + """ + :param SqlDatabaseReader sql_reader: the inventory database + """ + super(Inventory, self).__init__() + self._sql_reader = sql_reader + + def query(self, sql_query): + return self._sql_reader.query(sql_query) + + def machine_name_toMachine_spec_id(self, machine_name ): + machine_spec_id = self._sql_reader.get_table_attr( 'machines', 'name', machine_name, 'machine_spec_id' ) + return machine_spec_id + + # electricity related methods + + def machine_spec_id_to_power_consumption(self, machine_spec_id ): + power_consumption = self._sql_reader.get_table_attr( 'machine_spec_to_power_consumption', 'machine_spec_id', machine_spec_id, 'power_consumption' ) + return power_consumption + + def get_plug_type_attr(self, plug_type, attr_name): + # INSERT INTO `powerplug_type_desc` (`plug_type_id`, `genre`, `max_amps`) VALUES + # ('iec60309_blue_pne6h_32a_m', 'm', 32.0), + attr_value = self._sql_reader.get_table_attr('powerplug_type_desc', 'plug_type_id', plug_type, attr_name ) + return attr_value + + def read_plug_capacity(self, plug): + plug_capacity = None + machine_spec_id = self.machine_name_toMachine_spec_id(plug.machine.name) + if machine_spec_id is not None: + # INSERT INTO `powerplug_desc` (`machine_spec_id`, `powerplug_id`, `plug_type`) VALUES + # ('atos_mpdu_2901382', 'i', 'iec60309_blue_pne6h_32a_m'), + rows = self._sql_reader.query("SELECT plug_type FROM powerplug_desc WHERE machine_spec_id='%s' AND powerplug_id='%s'" % (machine_spec_id, plug.name)) + if len(rows) > 0: + plug_type = rows[0][0] + # print('plug_type : %s' % plug_type) + + plug_capacity = get_plug_type_attr(plug_type, 'max_amps') + #if plug_capacity: + # print('plug_capacity : %f A' % plug_capacity) + # print("read_plug_capacity : plug capacity for plug.machine.name="+plug.machine.name+" plug="+str(plug)+" : "+ str(plug_capacity)+ "A") + return plug_capacity + + # cluster related methods + + def get_machine_purchase_date(self, machine_serial_number): + ordering_id = self._sql_reader.get_table_attr( 'machines', 'serial_number', machine_serial_number, 'command_id' ) + # print(ordering_id) + # handle case of multiple orders + ordering_id = ordering_id.split('+')[0] + if len(ordering_id) == 0: + return None + ordering_date_as_str = self._sql_reader.get_table_attr( 'orderings', 'ordering_id', ordering_id, 'ordering_date' ) + if ordering_date_as_str is None: + return None + if len(ordering_date_as_str) == 0: + return None + ordering_date = datetime.datetime.strptime(ordering_date_as_str, '%d/%m/%Y') + return ordering_date + + def get_cpu_dflops(self, cpu_model): + ''' + returns the number of double precision operation per second this cpu can achieve + ''' + #INSERT INTO `cpu_specs` (`cpu_model`, `num_cores`, `clock_speed`, `dflops_per_core_per_cycle`, `comment`) VALUES + #('intel_xeon_x5550', 4, 2.67, 4, ''), + num_cores = int(self._sql_reader.get_table_attr( 'cpu_specs', 'cpu_model', cpu_model, 'num_cores' )) + clock_speed = float(self._sql_reader.get_table_attr( 'cpu_specs', 'cpu_model', cpu_model, 'clock_speed' )) + dflops_per_core_per_cycle = int(self._sql_reader.get_table_attr('cpu_specs', 'cpu_model', cpu_model, 'dflops_per_core_per_cycle' )) + print(num_cores, clock_speed, dflops_per_core_per_cycle) + return clock_speed * dflops_per_core_per_cycle * num_cores + + def get_computer_dflops(self, computer_serial_number): + print(computer_serial_number) + num_cpus = int(self._sql_reader.get_table_attr( 'computer_to_cpu', 'serial_number', computer_serial_number, 'num_cpu' )) + cpu_model = self._sql_reader.get_table_attr( 'computer_to_cpu', 'serial_number', computer_serial_number, 'cpu_model' ) + flops = num_cpus * self.get_cpu_dflops( cpu_model ) + return flops + + def get_computer_options_price(self, computer_name): + options_price = 0.0 + if computer_name == 'simpatix58' or computer_name == 'simpatix59': + return 7675.0 / 4 * 2 # each of these computers has 2 nvidia fermi C2050 gpus + return options_price + + def get_item_ownership(self, item_serial_number): + ownership=[] + + rows = self._sql_reader.query("SELECT * FROM ownership") + for row in rows: + (serial_number, owner, owner_ratio, comment)=row + if serial_number == item_serial_number: + ownership.append({'owner':owner, 'owner_ratio':owner_ratio}) + return ownership + +