]>
git.ipfire.org Git - nitsi.git/blob - src/nitsi/recipe.py
6 logger
= logging
.getLogger("nitsi.recipe")
10 class RecipeExeption(Exception):
11 def __init__(self
, message
):
12 self
.message
= message
16 # Should read the test, check if the syntax are valid
17 # and return tuples with the ( host, command ) structure
19 def __init__(self
, path
, circle
=[], machines
=[]):
20 self
.recipe_file
= path
22 self
.path
= os
.path
.dirname(self
.recipe_file
)
23 self
.path
= os
.path
.abspath(self
.path
)
24 self
.name
= os
.path
.basename(self
.path
)
25 except BaseException
as e
:
26 logger
.error("Failed to get the path to this recipe")
29 self
.log
= logger
.getChild(self
.name
)
30 self
.log
.debug("Path of recipe is: {}".format(self
.recipe_file
))
32 self
._machines
= machines
33 self
._fallback
_machines
= fallback_machines
35 self
.log
.debug("Machine names we use when we substitute the all statement: {}".format(self
._machines
))
37 self
.log
.debug("Length of the cirle list {}".format(len(circle
)))
38 self
.in_recursion
= True
40 self
.in_recursion
= False
42 self
.log
.debug("We are in a recursion: {}".format(self
.in_recursion
))
45 self
.log
.debug("Recipes we have already included: {}".format(self
.circle
))
47 if not os
.path
.isfile(self
.recipe_file
):
48 self
.log
.error("{} is not a file".format(self
.recipe_file
))
49 raise RecipeExeption("{} is not a file".format(self
.recipe_file
))
52 with
open(self
.recipe_file
) as fobj
:
53 self
.raw_recipe
= fobj
.readlines()
54 except FileNotFoundError
as error
:
55 self
.log
.error("No such file: {}".format(self
.recipe_file
))
72 for line
in self
.raw_recipe
:
73 # Check if the line is empty
74 if line
.strip() == "":
75 self
.log
.debug("Skipping empty line {}".format(i
))
79 # Check if the line is a comment
80 if line
.strip().startswith("#"):
81 self
.log
.debug("Skipping comment in line {}".format(i
))
85 raw_line
= line
.split(":", 1)
87 self
.log
.error("Error parsing the recipe in line {}".format(i
))
88 raise RecipeExeption("Error parsing the recipe in line {}".format(i
))
89 cmd
= raw_line
[1].strip()
91 raw_line
= raw_line
[0].strip().split(" ")
92 if len(raw_line
) == 0:
93 self
.log
.error("Failed to parse the recipe in line {}".format(i
))
94 raise RecipeExeption("Failed to parse the recipe in line {}".format(i
))
96 if raw_line
[0].strip() == "":
97 self
.log
.error("Failed to parse the recipe in line {}".format(i
))
98 raise RecipeExeption("Failed to parse the recipe in line {}".format(i
))
100 machine
= raw_line
[0].strip()
102 if len(raw_line
) == 2:
103 extra
= raw_line
[1].strip()
107 # We could get a machine here or a include statement
108 if machine
== "include":
110 path
= os
.path
.normpath(self
.path
+ "/" + path
)
112 # If we did not get a valid file we asume that we get a valid path to a test.
113 if os
.path
.isdir(path
):
114 path
= path
+ "/recipe"
116 if path
in self
.circle
:
117 self
.log
.error("Detect import loop!")
118 raise RecipeExeption("Detect import loop!")
119 self
.circle
.append(path
)
120 recipe_to_include
= Recipe(path
, circle
=self
.circle
)
122 if machine
== "include":
123 self
._recipe
.extend(recipe_to_include
.recipe
)
125 # Support also something like 'alice,bob: echo'
126 machines
= machine
.split(",")
127 for machine
in machines
:
128 self
._recipe
.append((machine
.strip(), extra
.strip(), cmd
.strip()))
131 if not self
.in_recursion
:
133 for line
in self
._recipe
:
135 tmp_recipe
.append(line
)
137 for machine
in self
.machines
:
138 tmp_recipe
.append((machine
.strip(), line
[1], line
[2]))
140 self
._recipe
= tmp_recipe