Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
M
mpsd-software-manager
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
MPSD Computational Science
mpsd-software-manager
Commits
5ef97087
Commit
5ef97087
authored
1 year ago
by
Ashwin Kumar Karnad
Browse files
Options
Downloads
Plain Diff
Merge branch 'simplify-log-file-path-generation' into 'main'
Simplify log file path generation Closes
#24
See merge request
!96
parents
1ee726e4
9e54342d
No related branches found
Branches containing commit
No related tags found
1 merge request
!96
Simplify log file path generation
Pipeline
#375493
passed
1 year ago
Stage: test
Changes
2
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/mpsd_software_manager/mpsd_software.py
+177
-68
177 additions, 68 deletions
src/mpsd_software_manager/mpsd_software.py
tests/test_mpsd_software.py
+7
-7
7 additions, 7 deletions
tests/test_mpsd_software.py
with
184 additions
and
75 deletions
src/mpsd_software_manager/mpsd_software.py
+
177
−
68
View file @
5ef97087
...
...
@@ -90,12 +90,59 @@ config_vars = {
}
def
create_log_file_names
(
def
log_metadata
(
key
:
str
,
value
:
str
)
->
None
:
"""
Log metadata to the log file.
This function logs metadata to the log file. The metadata is
enclosed in a tag, so that it can be easily found in the log file.
logging module is used to write the metadata to the log file.
Parameters
----------
key : str
key of the metadata
value : str
value of the metadata
returns : None
"""
logging
.
info
(
f
"
{
config_vars
[
'
metadata_tag_open
'
]
}{
key
}
:
{
value
}{
config_vars
[
'
metadata_tag_close
'
]
}
"
)
def
read_metadata_from_logfile
(
logfile
:
Union
[
str
,
Path
])
->
dict
:
"""
Read metadata from the log file.
This function reads metadata from the log file. The metadata is
enclosed in a tag, so that it can be easily found in the log file.
Parameters
----------
logfile : str or Path
log file name
returns : dict
dictionary containing the metadata
"""
with
open
(
logfile
,
"
r
"
)
as
f
:
log_text
=
f
.
read
()
# check for all data that matches the regex
# metadata_tag_open {key}:{value} metadata_tag_close
# and return a dictionary with all the matches
return
{
match
.
group
(
1
):
match
.
group
(
2
)
for
match
in
re
.
finditer
(
rf
"
{
config_vars
[
'
metadata_tag_open
'
]
}
(\w+):(\w+)
{
config_vars
[
'
metadata_tag_close
'
]
}
"
,
log_text
,
)
}
def
create_log_file_name
(
mpsd_release
:
str
,
microarch
:
str
,
action
:
str
,
date
:
str
=
call_date_iso
,
package_set
:
str
=
None
,
package_set
:
Union
[
str
,
None
]
=
None
,
)
->
Union
[
str
,
None
]:
"""
Create log file names.
...
...
@@ -119,7 +166,7 @@ def create_log_file_names(
action : str
action performed (install,remove,reinstall,prepare,status)
only install and remove are valid for build log file.
package_set : str
package_set : str
or None
package_set name (only for build log file)
Returns
...
...
@@ -128,8 +175,48 @@ def create_log_file_names(
log file name
installer_log_file_name or build_log_file_name depending on the
parameters given.
If the action is not one that changes the files on disk (
info only actions)
If the action is not one that changes the files on disk (info only actions)
then None is returned.
Examples
--------
# installer log file name for `mpsd-software install dev-23a foss2021a-mpi`
>>>
create_log_file_name
(
...
"
dev-23a
"
,
...
"
sandybridge
"
,
...
"
install
"
,
...
"
2023-07-03T12-27-52
"
,
...
)
'
dev-23a_sandybridge_2023-07-03T12-27-52_APEX_install.log
'
# build log file name for `mpsd-software install dev-23a foss2021a-mpi`
>>>
create_log_file_name
(
...
"
dev-23a
"
,
...
"
sandybridge
"
,
...
"
install
"
,
...
"
2023-07-03T12-27-52
"
,
...
"
foss2021a-mpi
"
,
...
)
'
dev-23a_sandybridge_2023-07-03T12-27-52_BUILD_foss2021a-mpi_install.log
'
# installer log file name for `mpsd-software status dev-23a`
>>>
create_log_file_name
(
...
"
dev-23a
"
,
...
"
sandybridge
"
,
...
"
status
"
,
...
"
2023-07-03T12-27-52
"
,
...
)
'
dev-23a_sandybridge_2023-07-03T12-27-52_APEX_status.log
'
# build log file name for `mpsd-software status dev-23a` (no log file is created)
>>>
create_log_file_name
(
...
"
dev-23a
"
,
...
"
sandybridge
"
,
...
"
status
"
,
...
"
2023-07-03T12-27-52
"
,
...
"
foss2021a-mpi
"
,
...
)
(
None
)
"""
if
package_set
:
# if package_set is given, then we build the build_log_file_name
...
...
@@ -146,73 +233,97 @@ def create_log_file_names(
return
log_file_name
def
log_metadata
(
key
:
str
,
value
:
str
)
->
None
:
"""
Log metadata to the log file.
This function logs metadata to the log file. The metadata is
enclosed in a tag, so that it can be easily found in the log file.
logging module is used to write the metadata to the log file.
Parameters
----------
key : str
key of the metadata
value : str
value of the metadata
returns : None
"""
logging
.
info
(
f
"
{
config_vars
[
'
metadata_tag_open
'
]
}{
key
}
:
{
value
}{
config_vars
[
'
metadata_tag_close
'
]
}
"
)
def
get_log_file_path
(
mpsd_release
:
str
,
cmd
:
str
,
root_dir
:
Path
,
package_set
:
Union
[
str
,
None
]
=
None
)
->
Union
[
Path
,
None
]:
"""
Get log file path.
This function creates the log file paths for either the installer or
the build log files.
def
read_metadata_from_logfile
(
logfile
:
Union
[
str
,
Path
])
->
dict
:
"""
Read metadata from the log file
.
If a package_set is given, then the build
log
file
path is returned.
if no package_set is given, then the installer log file path is returned
.
This function reads metadata from the log file. The metadata is
enclosed in a tag, so that it can be easily found in the log file.
If the logs folder does not exist, then it is created.
Parameters
----------
logfile : str or Path
log file name
returns : dict
dictionary containing the metadata
"""
with
open
(
logfile
,
"
r
"
)
as
f
:
log_text
=
f
.
read
()
# check for all data that matches the regex
# metadata_tag_open {key}:{value} metadata_tag_close
# and return a dictionary with all the matches
return
{
match
.
group
(
1
):
match
.
group
(
2
)
for
match
in
re
.
finditer
(
rf
"
{
config_vars
[
'
metadata_tag_open
'
]
}
(\w+):(\w+)
{
config_vars
[
'
metadata_tag_close
'
]
}
"
,
log_text
,
)
}
mpsd_release : str
MPSD software stack version
cmd : str
command to be executed
root_dir : str
root directory of the mpsd software stack
package_set : str
package_set name (only for build log file)
Returns
-------
Path or None
log file path
installer_log_file_path or build_log_file_path depending on the
parameters given.
def
get_installer_log_file_path
(
mpsd_release
:
str
,
cmd
:
str
,
root_dir
:
str
)
->
str
:
"""
Get installer log file path.
"""
Examples
--------
# installer log file path for `mpsd-software install dev-23a foss2021a-mpi`
>>>
get_log_file_path
(
...
"
dev-23a
"
,
...
"
install
"
,
...
Path
(
...
"
/tmp/root_dir
"
...
),
...
)
PosixPath
(
'
/tmp/root_dir/dev-23a/logs/dev-23a_zen3_2023-07-03T12-28-55_APEX_install.log
'
)
# build log file path for `mpsd-software install dev-23a foss2021a-mpi`
>>>
get_log_file_path
(
...
"
dev-23a
"
,
...
"
install
"
,
...
Path
(
...
"
/tmp/root_dir
"
...
),
...
"
foss2021a-mpi
"
,
...
)
PosixPath
(
'
/tmp/root_dir/dev-23a/logs/dev-23a_zen3_2023-07-03T12-28-55_BUILD_foss2021a-mpi_install.log
'
)
# installer log file path for `mpsd-software status dev-23a`
>>>
get_log_file_path
(
...
"
dev-23a
"
,
...
"
status
"
,
...
Path
(
...
"
/tmp/root_dir
"
...
),
...
)
PosixPath
(
'
/tmp/root_dir/dev-23a/logs/dev-23a_zen3_2023-07-03T12-28-55_APEX_status.log
'
)
# build log file path for `mpsd-software status dev-23a` (no log file is created)
>>>
get_log_file_path
(
...
"
dev-23a
"
,
...
"
status
"
,
...
Path
(
...
"
/tmp/root_dir
"
...
),
...
"
foss2021a-mpi
"
,
...
)
(
None
)
"""
# Get machine configs
os
.
environ
.
get
(
"
MPSD_OS
"
,
"
UNKNOWN_OS
"
)
microarch
=
get_native_microarchitecture
()
# parse logging first
# decide the log_file_name
installer_log_name
=
create_log_file_names
(
mpsd_release
=
mpsd_release
,
microarch
=
microarch
,
action
=
cmd
log_file_name
=
create_log_file_name
(
mpsd_release
=
mpsd_release
,
microarch
=
microarch
,
action
=
cmd
,
package_set
=
package_set
,
)
log_folder
=
root_dir
/
mpsd_release
/
"
logs
"
# if the log_folder dosent exist, dont log this message if
# the command is a info-only command
if
cmd
not
in
[
"
status
"
,
"
available
"
]:
if
not
os
.
path
.
exists
(
log_folder
):
os
.
makedirs
(
log_folder
)
installer_log_file
=
log_folder
/
installer_log_name
if
log_file_name
:
# if the log_folder dosent exist, create it
if
not
log_folder
.
exists
():
log_folder
.
mkdir
(
parents
=
True
)
return
log_folder
/
log_file_name
else
:
installer_log_file
=
None
return
installer_log_file
return
None
def
set_up_logging
(
loglevel
=
"
warning
"
,
file_path
=
None
):
...
...
@@ -556,7 +667,9 @@ def run(*args, counter=[0], **kwargs):
return
process
def
record_script_execution_summary
(
root_dir
:
str
,
msg
:
str
=
None
,
**
kwargs
)
->
None
:
def
record_script_execution_summary
(
root_dir
:
Path
,
msg
:
Union
[
str
,
None
]
=
None
,
**
kwargs
)
->
None
:
"""
Log the command used to build the package_set.
It also logs information about the spack-environments branch and commit hash,
...
...
@@ -928,14 +1041,9 @@ def install_environment(
# run spack_setup_script with the package_sets as arguments
for
package_set
in
package_sets
:
# Set the install log file name from create_log_file_names
build_log_
file_name
=
create
_log_file_
names
(
mpsd_release
,
microarch
,
"
install
"
,
package_set
=
package_set
build_log_
path
=
get
_log_file_
path
(
mpsd_release
,
"
install
"
,
root_dir
,
package_set
)
build_log_folder
=
release_base_dir
/
"
logs
"
build_log_path
=
build_log_folder
/
build_log_file_name
# if logs folder dosent exist, create it
if
not
os
.
path
.
exists
(
build_log_folder
):
os
.
makedirs
(
build_log_folder
)
logging
.
info
(
f
"
Installing package_set
{
package_set
}
to
{
package_set_dir
}
"
)
...
...
@@ -1003,7 +1111,7 @@ def start_new_environment(release, from_release, target_dir):
raise
NotImplementedError
(
msg
)
def
environment_status
(
mpsd_release
:
str
,
root_dir
:
Union
[
str
,
Path
]
)
->
dict
:
def
environment_status
(
mpsd_release
:
str
,
root_dir
:
Path
)
->
Union
[
dict
,
None
]
:
"""
Show status of release in installation.
Parameters
...
...
@@ -1020,6 +1128,7 @@ def environment_status(mpsd_release: str, root_dir: Union[str, Path]) -> dict:
toolchain_map : dict
A dictionary containing available microarchitectures as keys and
a list of available package_sets as values for each microarchitecture.
If the release is not installed/found, None is returned.
Note: only toolchains can be reported at the moment (i.e. package_sets
such as global and global_generic are missing, even if installed).
...
...
@@ -1271,7 +1380,7 @@ def main():
root_dir
=
get_root_dir
()
# set up logging ( with file handler) for all actions (except init)
log_file
=
get_
installer_
log_file_path
(
log_file
=
get_log_file_path
(
args
.
release
,
args
.
action
,
root_dir
,
...
...
This diff is collapsed.
Click to expand it.
tests/test_mpsd_software.py
+
7
−
7
View file @
5ef97087
...
...
@@ -280,7 +280,7 @@ def test_install_environment_zlib():
# install global_generic package_set
mod
.
set_up_logging
(
"
WARNING
"
,
mod
.
get_
installer_
log_file_path
(
mpsd_release_to_test
,
"
install
"
,
root_dir
),
mod
.
get_log_file_path
(
mpsd_release_to_test
,
"
install
"
,
root_dir
),
)
mod
.
install_environment
(
mpsd_release
=
mpsd_release_to_test
,
...
...
@@ -333,7 +333,7 @@ def test_install_environment_zlib():
importlib
.
reload
(
mod
)
mod
.
set_up_logging
(
"
WARNING
"
,
mod
.
get_
installer_
log_file_path
(
mpsd_release_to_test
,
"
install
"
,
root_dir
),
mod
.
get_log_file_path
(
mpsd_release_to_test
,
"
install
"
,
root_dir
),
)
mod
.
install_environment
(
mpsd_release
=
mpsd_release_to_test
,
...
...
@@ -417,16 +417,16 @@ def test_get_available_package_sets():
)
def
test_create_log_file_name
s
():
def
test_create_log_file_name
():
"""
Test that the log file names are created correctly.
"""
create_log_file_name
s
=
mod
.
create_log_file_name
s
create_log_file_name
=
mod
.
create_log_file_name
mpsd_release
=
"
dev-23a
"
microarch
=
"
sandybridge
"
date
=
datetime
.
datetime
.
now
().
replace
(
microsecond
=
0
).
isoformat
()
action
=
"
install
"
package_set
=
"
foss2021a
"
# test build_log_file_name generation
build_log_file_name
=
create_log_file_name
s
(
build_log_file_name
=
create_log_file_name
(
microarch
=
microarch
,
mpsd_release
=
mpsd_release
,
date
=
date
,
...
...
@@ -437,7 +437,7 @@ def test_create_log_file_names():
build_log_file_name
==
f
"
{
mpsd_release
}
_
{
microarch
}
_
{
date
}
_BUILD_
{
package_set
}
_
{
action
}
.log
"
)
installer_log_file_name
=
create_log_file_name
s
(
installer_log_file_name
=
create_log_file_name
(
microarch
=
microarch
,
mpsd_release
=
mpsd_release
,
date
=
date
,
...
...
@@ -448,7 +448,7 @@ def test_create_log_file_names():
==
f
"
{
mpsd_release
}
_
{
microarch
}
_
{
date
}
_APEX_
{
action
}
.log
"
)
# test no build log file for incorrect action
build_log_file_name
=
create_log_file_name
s
(
build_log_file_name
=
create_log_file_name
(
microarch
=
microarch
,
mpsd_release
=
mpsd_release
,
date
=
date
,
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment