3
3
import re
4
4
from functools import reduce
5
5
from cProfile import Profile
6
+ from django .utils import timezone
6
7
7
- from django .core .management .base import BaseCommand , CommandError
8
+ from django .core .management .base import BaseCommand
8
9
from simple_history .utils import bulk_update_with_history , bulk_create_with_history
9
10
10
11
from coldfront .core .resource .models import ResourceType , ResourceAttribute , ResourceAttributeType , AttributeType , Resource
11
12
from coldfront .core .project .models import Project
12
13
from coldfront .plugins .slurm .utils import slurm_get_nodes_info
13
- from django .utils .datetime_safe import datetime
14
14
15
15
logger = logging .getLogger (__name__ )
16
16
@@ -68,13 +68,19 @@ def calculate_owner_value(project_list, row):
68
68
return 'FASRC'
69
69
return owner_name
70
70
71
+ def get_cluster ():
72
+ return Resource .objects .get (resource_type__name = 'Cluster' )
73
+
74
+
71
75
env = options ['environment' ] or 'production'
72
76
if 'dev' in env :
73
- output = self .get_output_from_file (os .path .join (os .getcwd (), 'coldfront/plugins/slurm/management/commands/sinfo_output .txt' ))
77
+ output = self .get_output_from_file (os .path .join (os .getcwd (), 'coldfront/plugins/slurm/management/commands/sinfo .txt' ))
74
78
else :
75
79
output = slurm_get_nodes_info ()
76
80
logger .debug (f'Running on { env } mode' )
81
+ modify_history_date = timezone .now ()
77
82
project_list = Project .objects .all ()
83
+ current_cluster = get_cluster ()
78
84
compute_node = ResourceType .objects .get (name = 'Compute Node' )
79
85
attribute_type_name_list = ['GPU Count' , 'Core Count' , 'Features' , 'Owner' , 'ServiceEnd' ]
80
86
partition_resource_type = ResourceType .objects .get (name = 'Cluster Partition' )
@@ -96,7 +102,14 @@ def calculate_owner_value(project_list, row):
96
102
bulk_update_resource = []
97
103
processed_resource_attribute = []
98
104
for row in output :
99
- new_resource , compute_node_created_created = Resource .objects .get_or_create (name = row ['nodelist' ], defaults = {'is_allocatable' :False , 'resource_type' :compute_node })
105
+ new_resource , compute_node_created_created = Resource .objects .get_or_create (
106
+ name = row ['nodelist' ],
107
+ defaults = {
108
+ 'is_allocatable' :False ,
109
+ 'resource_type' :compute_node ,
110
+ 'parent_resource' :current_cluster
111
+ }
112
+ )
100
113
Resource .objects .get_or_create (name = row ['partition' ], defaults = {'resource_type' :partition_resource_type })
101
114
102
115
gpu_count = ResourceAttribute (resource_attribute_type = gpu_count_attribute_type , resource = new_resource , value = calculate_gpu_count (row ['gres' ]))
@@ -143,13 +156,27 @@ def calculate_owner_value(project_list, row):
143
156
new_resource .is_available = True
144
157
bulk_update_resource .append (new_resource )
145
158
service_end_pk = existing_resource_attributes_pk_map [f"{ row ['nodelist' ]} { service_end_attribute_type .name } " ]
146
- bulk_update_resource_attribute .append (ResourceAttribute (resource = new_resource , value = None , resource_attribute_type = service_end_attribute_type , pk = service_end_pk ))
159
+ bulk_update_resource_attribute .append (
160
+ ResourceAttribute (
161
+ resource = new_resource , value = None ,
162
+ resource_attribute_type = service_end_attribute_type ,
163
+ pk = service_end_pk ,
164
+ modified = modify_history_date
165
+ )
166
+ )
147
167
processed_resources .add (new_resource .name )
148
168
try :
149
169
logger .debug (f'Updating { len (bulk_update_resource_attribute )} ResourceAttribute records' )
150
- bulk_update_with_history (bulk_update_resource_attribute , ResourceAttribute , ['value' ], batch_size = 500 , default_change_reason = 'slurm_manage_resource command' )
170
+ bulk_update_with_history (
171
+ bulk_update_resource_attribute , ResourceAttribute , ['value' ],
172
+ batch_size = 500 , default_change_reason = 'slurm_manage_resource command' ,
173
+ default_date = modify_history_date
174
+ )
151
175
logger .debug (f'Updating { len (bulk_update_resource )} Resource records' )
152
- bulk_update_with_history (bulk_update_resource , Resource , ['is_available' ], batch_size = 500 , default_change_reason = 'slurm_manage_resource command' )
176
+ bulk_update_with_history (
177
+ bulk_update_resource , Resource , ['is_available' ], batch_size = 500 ,
178
+ default_change_reason = 'slurm_manage_resource command' , default_date = modify_history_date
179
+ )
153
180
logger .debug (f'Creating { len (bulk_create_resource_attribute )} ResourceAttribute records' )
154
181
bulk_create_with_history (bulk_create_resource_attribute , ResourceAttribute , batch_size = 500 , default_change_reason = 'slurm_manage_resource command' )
155
182
except Exception as e :
@@ -161,19 +188,25 @@ def calculate_owner_value(project_list, row):
161
188
for resource_to_delete in Resource .objects .exclude (name__in = list (processed_resources )).filter (is_available = True , resource_type = compute_node ):
162
189
resource_to_delete .is_available = False
163
190
bulk_update_resource .append (resource_to_delete )
164
- service_end = ResourceAttribute (resource = resource_to_delete , value = str ( datetime . now ()) , resource_attribute_type = service_end_attribute_type )
191
+ service_end = ResourceAttribute (resource = resource_to_delete , value = modify_history_date , resource_attribute_type = service_end_attribute_type )
165
192
if f"{ resource_to_delete .name } { service_end_attribute_type .name } " in existing_resource_attributes_check :
166
193
service_end .pk = existing_resource_attributes_pk_map [f"{ resource_to_delete .name } { service_end_attribute_type .name } " ]
167
194
bulk_update_resource_attribute .append (service_end )
168
195
else :
169
196
bulk_create_resource_attribute .append (service_end )
170
197
try :
171
- logger .debug (f'Decommissioning { len (bulk_update_resource )} Resource records' )
172
- bulk_update_with_history (bulk_update_resource , Resource , ['is_available' ], batch_size = 500 , default_change_reason = 'slurm_manage_resource command' )
198
+ logger .debug (f'Decommissioning { bulk_update_resource } Resource records' )
199
+ bulk_update_with_history (
200
+ bulk_update_resource , Resource , ['is_available' ], batch_size = 500 ,
201
+ default_change_reason = 'slurm_manage_resource command' , default_date = modify_history_date
202
+ )
173
203
logger .debug (f'Creating { len (bulk_create_resource_attribute )} ServiceEnd ResourceAttribute records' )
174
204
bulk_create_with_history (bulk_create_resource_attribute , ResourceAttribute , batch_size = 500 , default_change_reason = 'slurm_manage_resource command' )
175
205
logger .debug (f'Updating { len (bulk_update_resource_attribute )} ServiceEnd ResourceAttribute records' )
176
- bulk_update_with_history (bulk_update_resource_attribute , ResourceAttribute , ['value' ], batch_size = 500 , default_change_reason = 'slurm_manage_resource command' )
206
+ bulk_update_with_history (
207
+ bulk_update_resource_attribute , ResourceAttribute , ['value' ], batch_size = 500 ,
208
+ default_change_reason = 'slurm_manage_resource command' , default_date = modify_history_date
209
+ )
177
210
except Exception as e :
178
211
logger .error (f'Error cleaning up resources: { str (e )} ' )
179
212
raise
0 commit comments