1
1
import logging
2
2
import json
3
3
import semver
4
+ import yaml
4
5
5
6
import validators as v
6
7
10
11
metadata_annotations_required_fields ,
11
12
spec_required_fields )
12
13
14
+ log_info = {'current_manifest_file' : '' }
13
15
logger = logging .getLogger (__name__ )
16
+ logger .propagate = False
17
+ handler = logging .StreamHandler ()
18
+ formatter = logging .Formatter ('%(levelname)s: %(message)s [%(current_manifest_file)s]' )
19
+ handler .setFormatter (formatter )
20
+ logger .addHandler (handler )
21
+ logger = logging .LoggerAdapter (logger , log_info )
14
22
15
23
16
24
class ValidateCmd ():
17
25
dataKey = "data"
26
+ metadataKey = "metadata"
18
27
crdKey = "customResourceDefinitions"
19
28
csvKey = "clusterServiceVersions"
20
29
pkgsKey = "packages"
@@ -46,6 +55,17 @@ def _log_error(self, message, *args, **kwargs):
46
55
self .validation_json ['errors' ].append (message % args )
47
56
logger .error (message , * args , ** kwargs )
48
57
58
+ def get_filename_from_metadata (self , metadata , yaml_dict ):
59
+ """
60
+ :param yaml_dict: The yaml dictionary associated with a filename
61
+ :return: Filename associated with a yaml dictionary
62
+ """
63
+ filename = ""
64
+ hashed_key = hash (yaml .dump (yaml_dict ))
65
+ if hashed_key in metadata ["filenames" ]:
66
+ filename = metadata ["filenames" ][hashed_key ]
67
+ return filename
68
+
49
69
def validate (self , bundle , repository = None ):
50
70
"""validate takes a bundle as a dictionary and returns a boolean value that
51
71
describes if the bundle is valid. It also logs verification information when
@@ -69,15 +89,15 @@ def _bundle_validation(self, bundle, repository=None):
69
89
70
90
bundleData = bundle [self .dataKey ]
71
91
72
- validationDict [self .crdKey ] = self ._type_validation (bundleData , self .crdKey ,
92
+ validationDict [self .crdKey ] = self ._type_validation (bundle , self .crdKey ,
73
93
self ._crd_validation , False )
74
- validationDict [self .csvKey ] = self ._type_validation (bundleData , self .csvKey ,
94
+ validationDict [self .csvKey ] = self ._type_validation (bundle , self .csvKey ,
75
95
self ._csv_validation , True )
76
- validationDict [self .pkgsKey ] = self ._type_validation (bundleData , self .pkgsKey ,
96
+ validationDict [self .pkgsKey ] = self ._type_validation (bundle , self .pkgsKey ,
77
97
self ._pkgs_validation , True )
78
98
if self .ui_validate_io :
79
99
validationDict [self .csvKey ] &= self ._type_validation (
80
- bundleData , self .csvKey , self ._ui_validation_io , True )
100
+ bundle , self .csvKey , self ._ui_validation_io , True )
81
101
if validationDict [self .pkgsKey ] and repository is not None :
82
102
packageName = bundleData ['packages' ][0 ]['packageName' ]
83
103
if repository != packageName :
@@ -93,13 +113,18 @@ def _bundle_validation(self, bundle, repository=None):
93
113
94
114
return valid
95
115
96
- def _crd_validation (self , bundleData ):
116
+ def _crd_validation (self , bundle ):
97
117
logger .info ("Validating custom resource definitions." )
98
118
valid = True
99
119
120
+ bundle_metadata = bundle [self .metadataKey ]
121
+ bundleData = bundle [self .dataKey ]
100
122
crds = bundleData [self .crdKey ]
101
123
102
124
for crd in crds :
125
+ crd_file_name = self .get_filename_from_metadata (bundle_metadata , crd )
126
+ log_info ['current_manifest_file' ] = crd_file_name
127
+
103
128
if "metadata" in crd :
104
129
if "name" in crd ["metadata" ]:
105
130
logger .info ("Evaluating crd %s" , crd ["metadata" ]["name" ])
@@ -137,13 +162,18 @@ def _crd_validation(self, bundleData):
137
162
138
163
return valid
139
164
140
- def _csv_validation (self , bundleData ):
165
+ def _csv_validation (self , bundle ):
141
166
valid = True
142
167
logger .info ("Validating cluster service versions." )
143
168
169
+ bundle_metadata = bundle [self .metadataKey ]
170
+ bundleData = bundle [self .dataKey ]
144
171
csvs = bundleData [self .csvKey ]
145
172
146
173
for csv in csvs :
174
+ csv_file_name = self .get_filename_from_metadata (bundle_metadata , csv )
175
+ log_info ['current_manifest_file' ] = csv_file_name
176
+
147
177
if "metadata" in csv :
148
178
if self ._csv_metadata_validation (csv ["metadata" ]) is False :
149
179
valid = False
@@ -357,10 +387,12 @@ def _csv_metadata_validation(self, metadata):
357
387
358
388
return valid
359
389
360
- def _pkgs_validation (self , bundleData ):
390
+ def _pkgs_validation (self , bundle ):
361
391
valid = True
362
392
logger .info ("Validating packages." )
363
393
394
+ bundle_metadata = bundle [self .metadataKey ]
395
+ bundleData = bundle [self .dataKey ]
364
396
pkgs = bundleData [self .pkgsKey ]
365
397
366
398
num_pkgs = len (pkgs )
@@ -370,6 +402,8 @@ def _pkgs_validation(self, bundleData):
370
402
return False
371
403
372
404
pkg = pkgs [0 ]
405
+ pkg_file_name = self .get_filename_from_metadata (bundle_metadata , pkg )
406
+ log_info ['current_manifest_file' ] = pkg_file_name
373
407
374
408
if "packageName" in pkg :
375
409
logger .info ("Evaluating package %s" , pkg ["packageName" ])
@@ -409,11 +443,13 @@ def _pkgs_validation(self, bundleData):
409
443
410
444
return valid
411
445
412
- def _type_validation (self , bundleData , typeName , validator , required ):
446
+ def _type_validation (self , bundle , typeName , validator , required ):
447
+ bundleData = bundle [self .dataKey ]
448
+
413
449
valid = True
414
450
if typeName in bundleData :
415
451
if len (bundleData [typeName ]) != 0 :
416
- valid = validator (bundleData )
452
+ valid = validator (bundle )
417
453
elif required :
418
454
self ._log_error ("Bundle does not contain any %s." % typeName )
419
455
valid = False
@@ -423,10 +459,11 @@ def _type_validation(self, bundleData, typeName, validator, required):
423
459
424
460
return valid
425
461
426
- def _ui_validation_io (self , bundleData ):
462
+ def _ui_validation_io (self , bundle ):
427
463
valid = True
428
464
logger .info ("Validating cluster service versions for operatorhub.io UI." )
429
465
466
+ bundleData = bundle [self .dataKey ]
430
467
csvs = bundleData [self .csvKey ]
431
468
432
469
for csv in csvs :
0 commit comments