886 |
886 |
"""Compute and return the api version of a given OS.
|
887 |
887 |
|
888 |
888 |
This function will try to read the api version of the os given by
|
889 |
|
the 'name' parameter. By default, it wil use the constants.OS_DIR
|
890 |
|
as top-level directory for OSes, but this can be overriden by the
|
891 |
|
use of the os_dir parameter. Return value will be either an
|
892 |
|
integer denoting the version or None in the case when this is not
|
893 |
|
a valid OS name.
|
|
889 |
the 'name' parameter and residing in the 'os_dir' directory.
|
|
890 |
|
|
891 |
By default if os_dir is not given it will search for a matching name in all
|
|
892 |
the constants.OS_SEARCH_PATH directories.
|
|
893 |
|
|
894 |
Return value will be either an integer denoting the version or None in the
|
|
895 |
case when this is not a valid OS name.
|
894 |
896 |
|
895 |
897 |
"""
|
896 |
898 |
if os_dir is None:
|
897 |
|
os_dir = os.path.sep.join([constants.OS_DIR, name])
|
|
899 |
for base_dir in constants.OS_SEARCH_PATH:
|
|
900 |
t_os_dir = os.path.sep.join([base_dir, name])
|
|
901 |
if os.path.isdir(t_os_dir):
|
|
902 |
os_dir = t_os_dir
|
|
903 |
break
|
|
904 |
|
|
905 |
if os_dir is None:
|
|
906 |
raise errors.InvalidOS(name, "OS dir not found in search path")
|
898 |
907 |
|
899 |
908 |
api_file = os.path.sep.join([os_dir, "ganeti_api_version"])
|
900 |
909 |
|
... | ... | |
927 |
936 |
return api_version
|
928 |
937 |
|
929 |
938 |
|
930 |
|
def DiagnoseOS(top_dir=None):
|
|
939 |
def DiagnoseOS(top_dirs=None):
|
931 |
940 |
"""Compute the validity for all OSes.
|
932 |
941 |
|
933 |
|
For each name in the give top_dir parameter (if not given, defaults
|
934 |
|
to constants.OS_DIR), it will return an object. If this is a valid
|
|
942 |
For each name in all the given top directories (if not given defaults i
|
|
943 |
to constants.OS_SEARCH_PATH it will return an object. If this is a valid
|
935 |
944 |
os, the object will be an instance of the object.OS class. If not,
|
936 |
945 |
it will be an instance of errors.InvalidOS and this signifies that
|
937 |
946 |
this name does not correspond to a valid OS.
|
... | ... | |
940 |
949 |
list of objects
|
941 |
950 |
|
942 |
951 |
"""
|
943 |
|
if top_dir is None:
|
944 |
|
top_dir = constants.OS_DIR
|
|
952 |
if top_dirs is None:
|
|
953 |
top_dirs = constants.OS_SEARCH_PATH
|
945 |
954 |
|
946 |
|
try:
|
947 |
|
f_names = os.listdir(top_dir)
|
948 |
|
except EnvironmentError, err:
|
949 |
|
logger.Error("Can't list the OS directory: %s" % str(err))
|
950 |
|
return False
|
951 |
955 |
result = []
|
952 |
|
for name in f_names:
|
953 |
|
try:
|
954 |
|
os_inst = OSFromDisk(name, os.path.sep.join([top_dir, name]))
|
955 |
|
result.append(os_inst)
|
956 |
|
except errors.InvalidOS, err:
|
957 |
|
result.append(err)
|
|
956 |
for dir in top_dirs:
|
|
957 |
if os.path.isdir(dir):
|
|
958 |
try:
|
|
959 |
f_names = os.listdir(dir)
|
|
960 |
except EnvironmentError, err:
|
|
961 |
logger.Error("Can't list the OS directory %s: %s" % (dir,str(err)))
|
|
962 |
break
|
|
963 |
for name in f_names:
|
|
964 |
try:
|
|
965 |
os_inst = OSFromDisk(name, os_dir=os.path.sep.join([dir, name]))
|
|
966 |
result.append(os_inst)
|
|
967 |
except errors.InvalidOS, err:
|
|
968 |
result.append(err)
|
958 |
969 |
|
959 |
970 |
return result
|
960 |
971 |
|
... | ... | |
967 |
978 |
`errors.InvalidOS` exception, detailing why this is not a valid
|
968 |
979 |
OS.
|
969 |
980 |
|
|
981 |
Args:
|
|
982 |
os_dir: Directory containing the OS scripts. Defaults to a search
|
|
983 |
in all the OS_SEARCH_PATH directories.
|
|
984 |
|
970 |
985 |
"""
|
|
986 |
|
|
987 |
if os_dir is None:
|
|
988 |
for base_dir in constants.OS_SEARCH_PATH:
|
|
989 |
t_os_dir = os.path.sep.join([base_dir, name])
|
|
990 |
if os.path.isdir(t_os_dir):
|
|
991 |
os_dir = t_os_dir
|
|
992 |
break
|
|
993 |
|
971 |
994 |
if os_dir is None:
|
972 |
|
os_dir = os.path.sep.join([constants.OS_DIR, name])
|
|
995 |
raise errors.InvalidOS(name, "OS dir not found in search path")
|
973 |
996 |
|
974 |
|
api_version = _OSOndiskVersion(name, os_dir)
|
|
997 |
api_version = _OSOndiskVersion(name, os_dir=os_dir)
|
975 |
998 |
|
976 |
999 |
if api_version != constants.OS_API_VERSION:
|
977 |
1000 |
raise errors.InvalidOS(name, "API version mismatch (found %s want %s)"
|