Bug 1978 - trouver un moyen de rationaliser l'achat du r930 cper 2017
- refactored so that Inventory class is now reusable (for example for PowerDiagram)
This commit is contained in:
parent
b8c09eea89
commit
7c6656dc69
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue