Report: Add data
[csit.git] / resources / tools / presentation / environment.py
1 # Copyright (c) 2018 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 """Environment
15
16 Setting of the environment according to the specification specified in the
17 specification YAML file.
18 """
19
20 import os
21 import shutil
22 import logging
23
24 from pal_errors import PresentationError
25
26
27 class Environment:
28     """Setting of the environment:
29     - set environment variables,
30     - create directories.
31     """
32
33     def __init__(self, env, force=False):
34         """Initialization.
35
36         :param env: Environment specification.
37         :param force: If True, remove old build(s) if present.
38         :type env: dict
39         :type force: bool
40         """
41
42         self._env = env
43         self._force = force
44
45     @property
46     def environment(self):
47         """Getter.
48
49         :returns: Environment settings.
50         :rtype: dict
51         """
52         return self._env
53
54     def _make_dirs(self):
55         """Create the directories specified in the 'make-dirs' part of
56         'environment' section in the specification file.
57
58         :raises: PresentationError if it is not possible to remove or create a
59         directory.
60         """
61
62         if self._force:
63             logging.info(u"Removing old build(s) ...")
64             for directory in self._env[u"build-dirs"]:
65                 dir_to_remove = self._env[u"paths"][directory]
66                 if os.path.isdir(dir_to_remove):
67                     try:
68                         shutil.rmtree(dir_to_remove)
69                         logging.info(f"  Removed: {dir_to_remove}")
70                     except OSError:
71                         raise PresentationError(
72                             f"Cannot remove the directory {dir_to_remove}"
73                         )
74             logging.info(u"Done.")
75
76         logging.info(u"Making directories ...")
77
78         for directory in self._env[u"make-dirs"]:
79             dir_to_make = self._env[u"paths"][directory]
80             try:
81                 if os.path.isdir(dir_to_make):
82                     logging.warning(
83                         f"The directory {dir_to_make} exists, skipping."
84                     )
85                 else:
86                     os.makedirs(dir_to_make)
87                     logging.info(f"  Created: {dir_to_make}")
88             except OSError:
89                 raise PresentationError(
90                     f"Cannot make the directory {dir_to_make}"
91                 )
92
93         logging.info(u"Done.")
94
95     def set_environment(self):
96         """Set the environment.
97         """
98
99         self._make_dirs()
100
101
102 def clean_environment(env):
103     """Clean the environment.
104
105     :param env: Environment specification.
106     :type env: dict
107     """
108
109     logging.info(u"Cleaning the environment ...")
110
111     if not env[u"remove-dirs"]:  # None or empty
112         logging.info(u"  No directories to remove.")
113         return
114
115     for directory in env[u"remove-dirs"]:
116         dir_to_remove = env[u"paths"][directory]
117         logging.info(f"  Removing the working directory {dir_to_remove} ...")
118         if os.path.isdir(dir_to_remove):
119             try:
120                 shutil.rmtree(dir_to_remove)
121             except OSError as err:
122                 logging.warning(
123                     f"Cannot remove the directory {dir_to_remove}"
124                 )
125                 logging.debug(str(err))
126         else:
127             logging.warning(f"The directory {dir_to_remove} does not exist.")
128
129     logging.info(u"Done.")