class Usage(jsl.Document): class Options: description = "Stack usage" definition_id = "stack_usage" average_usage = jsl.StringField(required=True) low_public_usage_components = jsl.NumberField(required=True) redhat_distributed_components = jsl.NumberField(required=True)
class ComponentInfo(jsl.Document): class Options: description = "Information about a single component" definition_id = "component_info" blackduck_details = jsl.DocumentField(BlackduckDetails, as_ref=True, required=True) cve_details = jsl.ArrayField(jsl.DocumentField(CVEDetail, as_ref=True), required=True) ecosystem = jsl.StringField(required=True) github_details = jsl.DocumentField(GithubDetails, as_ref=True, required=True) id = jsl.StringField(required=True) latest_version = jsl.OneOfField([jsl.StringField(), jsl.NullField()], required=True) licenses = jsl.ArrayField(jsl.StringField(), required=True) name = jsl.StringField(required=True) package_dependents_count = jsl.NumberField(required=True) version = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v1_1_0) as added_in_v1_1_0: added_in_v1_1_0.dependents_count = jsl.NumberField(required=True) with jsl.Scope(lambda v: v >= ROLE_v1_2_0) as added_in_v1_2_0: added_in_v1_2_0.relative_usage = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as added_in_v2_0_0: added_in_v2_0_0.redhat_usage = jsl.DocumentField(RedHatUsage, as_ref=True, required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_3) as added_in_v2_0_3: added_in_v2_0_3.metadata = jsl.DocumentField(ComponentMetadata, as_ref=True, required=True)
class Metadata(jsl.Document): class Options: description = "Data from metadata file" definition_id = "metadata" components_with_dependency_lock_file = jsl.NumberField(required=True) components_with_tests = jsl.NumberField(required=True) required_engines = jsl.DocumentField(ComponentMetadataEngines, as_ref=True, required=True)
class ComponentAnalysis(JSLSchemaBaseWithRelease): class Options(object): definition_id = "component_analysis" description = "Software component analysis" ecosystem = jsl.StringField( description="Language ecosystem providing the component", required=True) package = jsl.StringField(description="Component name", required=True) version = jsl.StringField(description="Component version", required=True) latest_version = jsl.OneOfField( [jsl.StringField(), jsl.NullField()], description= "Latest version available of this component (null if unknown)", required=True) started_at = jsl.DateTimeField( description="Date/time component analysis was started", required=True) finished_at = jsl.DateTimeField( description="Date/time component analysis was finished", required=True) access_count = jsl.NumberField( description="Number of times this component has been queried", required=True) dependents_count = jsl.Var({ lambda v: v >= ROLE_v1_1_0: jsl.NumberField(description="Number of dependent GitHub projects", required=True) }) analyses = jsl.DocumentField(AnalysisSet, as_ref=True, required=True) package_info = jsl.DictField( description="Additional information related to the package", additional_properties=True, required=False)
class Year(jsl.Document): class Options: description = "GitHub Last Year Metrics" definition_id = "github_last_year_metrics" opened = jsl.NumberField(required=True) closed = jsl.NumberField(required=True)
class StackAnalysisReport(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack analysis report with aggregated data" definition_id = "stack_analysis_report" with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: v2_0_0.manifest_name = jsl.StringField(required=True) v2_0_0.ecosystem = jsl.StringField(required=True) v2_0_0.cvss = jsl.NumberField(required=True) v2_0_0.popularity = jsl.DocumentField(Popularity, as_ref=True, Required=True) v2_0_0.usage = jsl.DocumentField(Usage, as_ref=True, Required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_2) as v2_0_2: v2_0_2.recommendation = jsl.DocumentField(Recommendation, as_ref=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_3) as added_in_v2_0_3: added_in_v2_0_3.metadata = jsl.DocumentField(Metadata, as_ref=True, required=True) analyzed_components = jsl.NumberField(required=True) total_security_issues = jsl.NumberField(required=True) total_licenses = jsl.NumberField(required=True) components_with_security_issues = jsl.ArrayField(jsl.StringField(), required=True) distinct_licenses = jsl.ArrayField(jsl.StringField(), required=True) components = jsl.ArrayField(jsl.DocumentField(ComponentInfo, as_ref=True), required=True)
class Month(jsl.Document): class Options: description = "GitHub Last Month Metrics" definition_id = "github_last_month_metrics" opened = jsl.NumberField(required=True) closed = jsl.NumberField(required=True)
class Year(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "GitHub Last Year Metrics" definition_id = "github_last_year_metrics" opened = jsl.NumberField(required=True) closed = jsl.NumberField(required=True)
class GithubDetails(jsl.Document): class Options: description = "Github information for a single component" definition_id = "component_github_info" forks_count = jsl.NumberField(required=True) stargazers_count = jsl.NumberField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: v2_0_0.issues = jsl.DocumentField(GithubMetrics, as_ref=True, required=True) v2_0_0.pull_requests = jsl.DocumentField(GithubMetrics, as_ref=True, required=True)
class CodeMetricsSummary(jsl.Document): class Options(object): definition_id = "code_metrics_summary" description = "Summary computed by CodeMetrics worker" blank_lines = jsl.NumberField(required=True) code_lines = jsl.NumberField(required=True) comment_lines = jsl.NumberField(required=True) total_files = jsl.NumberField(required=True) total_lines = jsl.NumberField(required=True)
def dataclass_field_to_jsl_field(prop: dataclasses.Field, nullable=False) -> jsl.BaseField: t = dataclass_check_type(prop, date) if t: return jsl.DateTimeField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, datetime) if t: return jsl.DateTimeField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, str) if t: return jsl.StringField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, int) if t: return jsl.IntField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, float) if t: return jsl.NumberField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, bool) if t: return jsl.BooleanField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, dict) if t: return jsl.DictField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, ISchema) if t: subtype = jsonobject_to_jsl(t['schema'], nullable=nullable) return jsl.DocumentField(name=prop.name, document_cls=subtype, required=t['required']) t = dataclass_check_type(prop, list) if t: return jsl.ArrayField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, typing.List) if t: if 'schema' not in t.keys(): return jsl.ArrayField(name=prop.name, required=t['required']) if issubclass(t['schema'], ISchema): subtype = jsl.DocumentField( document_cls=jsonobject_to_jsl(t['schema'], nullable=nullable)) elif t['schema'] == str: subtype = jsl.StringField(name=prop.name) elif t['schema'] == int: subtype = jsl.IntField(name=prop.name) elif t['schema'] == float: subtype = jsl.NumberField(name=prop.name) elif t['schema'] == dict: subtype = jsl.DictField(name=prop.name) else: raise KeyError(t['schema']) return jsl.ArrayField(items=subtype, required=t['required']) raise KeyError(prop)
class CryptoAlgoDetail(jsl.Document): class Options(object): definition_id = "cryptoalgo_detail" crypto = jsl.StringField(required=True) file = jsl.StringField(required=True) matched_lines = jsl.NumberField() matchpercent = jsl.NumberField() matchtype = jsl.StringField(enum=["content", "filename"], required=True) sample_file = jsl.StringField() samples_lines = jsl.NumberField()
class Usage(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack usage" definition_id = "stack_usage" average_usage = jsl.StringField(required=True) low_public_usage_components = jsl.NumberField(required=True) redhat_distributed_components = jsl.NumberField(required=True)
class SimilarStacks(jsl.Document): class Options: description = "Stack Similarity Information" definition_id = "stack_similarity_information" analysis = jsl.DocumentField(SimilarityAnalysis, as_ref=True, required=True) similarity = jsl.NumberField(required=True) stack_id = jsl.NumberField(required=True) uri = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4: v2_1_4.source = jsl.StringField(required=True) v2_1_4.usage = jsl.NumberField(required=True) v2_1_4.original_score = jsl.NumberField(required=True)
class CodeMetricsLanguage(jsl.Document): class Options(object): definition_id = "languages" description = "Generic language specific statistics" blank_lines = jsl.NumberField(required=True) code_lines = jsl.NumberField(required=True) comment_lines = jsl.NumberField(required=True) files_count = jsl.NumberField(required=True) language = jsl.StringField(required=True) # Might be language-specific once we add support for new languages, leave it generic for now metrics = jsl.DictField(required=False, additional_properties=True)
class RegisteredSRPM(jsl.Document): class Options: description = "Red Hat internally registered SRPM details a single component" definition_id = "component_redhat_registered_srpms" patch_count = jsl.NumberField(required=True) epoch = jsl.NumberField(required=True) published_in = jsl.ArrayField(jsl.StringField(), required=True) modified_line_count = jsl.NumberField(required=True) package_name = jsl.StringField(required=True) modified_file_count = jsl.NumberField(required=True) version = jsl.StringField(required=True) release = jsl.StringField(required=True)
class CDTTableImportParamsSchemaCommon(jsl.Document): comment = jsl.StringField() subtrials = jsl.ArrayField(items=SubTrial, unique_items=True, required=True, min_items=1) margin_before = jsl.NumberField( minimum=0, required=True) # 0.3 by default in previous implementation. margin_after = jsl.NumberField( minimum=0, required=True) # 0.3 by default in previous implementation. trial_to_condition_func = jsl.StringField( required=True ) # should be a function of both event codes and trial idx.
class Metadata(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Data from metadata file" definition_id = "metadata" components_with_dependency_lock_file = jsl.NumberField(required=True) components_with_tests = jsl.NumberField(required=True) required_engines = jsl.DocumentField(ComponentMetadataEngines, as_ref=True, required=True)
def jsonobject_property_to_jsl_field(prop: jsonobject.JsonProperty, nullable=False) -> jsl.BaseField: if isinstance(prop, jsonobject.DateProperty): return jsl.DateTimeField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.DateTimeProperty): return jsl.DateTimeField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.StringProperty): return jsl.StringField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.IntegerProperty): return jsl.IntField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.FloatProperty): return jsl.NumberField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.BooleanProperty): return jsl.BooleanField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.DictProperty): if prop.item_wrapper: subtype = jsonobject_to_jsl(prop.item_wrapper.item_type, nullable=nullable) return jsl.DocumentField(name=prop.name, document_cls=subtype, required=prop.required) return jsl.DictField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.ListProperty): if prop.item_wrapper: if isinstance(prop.item_wrapper, jsonobject.ObjectProperty): if issubclass(prop.item_wrapper.item_type, jsonobject.JsonObject): subtype = jsl.DocumentField(document_cls=jsonobject_to_jsl( prop.item_wrapper.item_type), nullable=nullable) elif isinstance(prop.item_wrapper.item_type, jsonobject.JsonProperty): subtype = jsonobject_property_to_jsl_field( prop.item_wrapper.item_type) else: raise KeyError(prop.item_wrapper.item_type) elif isinstance(prop.item_wrapper, jsonobject.StringProperty): subtype = jsl.StringField(name=prop.name) elif isinstance(prop.item_wrapper, jsonobject.IntegerProperty): subtype = jsl.IntField(name=prop.name) elif isinstance(prop.item_wrapper, jsonobject.FloatProperty): subtype = jsl.NumberField(name=prop.name) elif isinstance(prop.item_wrapper, jsonobject.DictProperty): subtype = jsl.DictField(name=prop.name) else: raise KeyError(prop.item_wrapper) return jsl.ArrayField(items=subtype, required=prop.required) return jsl.ArrayField(name=prop.name, required=prop.required) raise KeyError(prop)
class BlackduckSecurityDetails(jsl.Document): class Options: description = "Blackduck information about one vulnerability for a single component" definition_id = "component_blackduck_security_info" with removed_in(ROLE_v2_2_0) as removed_in_v2_2_0: removed_in_v2_2_0.baseScore = jsl.NumberField(required=True) removed_in_v2_2_0.exploitabilitySubscore = jsl.NumberField(required=True) with added_in(ROLE_v2_2_0) as added_in_v2_2_0: added_in_v2_2_0.base_score = jsl.NumberField(required=True) added_in_v2_2_0.exploitability_subscore = jsl.NumberField(required=True) id = jsl.StringField(required=True) severity = jsl.StringField(required=True) source = jsl.StringField(required=True)
class LicenseScanSummary(jsl.Document): class Options(object): definition_id = "license_scan_summary" all_files = jsl.NumberField(description="Total number of files analysed") license_files = jsl.NumberField() source_files = jsl.NumberField() distinct_licenses = jsl.ArrayField(jsl.DocumentField(LicenseCount, as_ref=True), required=True) sure_licenses = jsl.ArrayField( jsl.StringField(), description="Licenses detected with high match confidence", required=True) licensed_files = jsl.NumberField()
class CVEDetail(jsl.Document): class Options(object): definition_id = "cvecheck_details" description = "Detail of one CVE" with removed_in(ROLE_v3_0_0) as removed_in_v3_0_0: # access/impact are now part of vector string in cvss dict removed_in_v3_0_0.access = jsl.DocumentField(CVEAccess, as_ref=True, required=True) removed_in_v3_0_0.impact = jsl.DocumentField(CVEImpact, as_ref=True, required=True) removed_in_v3_0_0.cvss = jsl.NumberField( required=True) # cvss is now dict removed_in_v3_0_0.summary = jsl.StringField( required=True) # renamed to description with added_in(ROLE_v3_0_0) as added_in_v3_0_0: added_in_v3_0_0.cvss = jsl.DocumentField(CVSS, as_ref=True, required=True) added_in_v3_0_0.description = jsl.StringField(required=True) added_in_v3_0_0.severity = jsl.StringField(required=True) with added_in(ROLE_v3_0_1) as added_in_v3_0_1: added_in_v3_0_1.attribution = jsl.StringField(required=False) id = jsl.StringField(required=True) references = jsl.ArrayField(jsl.UriField(), required=True) # Present if defined for the particular CVE cwe = jsl.StringField(required=False)
class CVEDetail(jsl.Document): class Options: description = "Information about one CVE for a single component" definition_id = "component_cve_info" cvss = jsl.NumberField(required=True) id = jsl.StringField(required=True)
class RegisteredSRPM(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Red Hat internally registered SRPM details a single component" definition_id = "component_redhat_registered_srpms" patch_count = jsl.NumberField(required=True) epoch = jsl.NumberField(required=True) published_in = jsl.ArrayField(jsl.StringField(), required=True) modified_line_count = jsl.NumberField(required=True) package_name = jsl.StringField(required=True) modified_file_count = jsl.NumberField(required=True) version = jsl.StringField(required=True) release = jsl.StringField(required=True)
class Popularity(jsl.Document): class Options: description = "Stack popularity" definition_id = "stack_popularity" average_forks = jsl.StringField(required=True) average_stars = jsl.StringField(required=True) low_popularity_components = jsl.NumberField(required=True)
class ModularAlertMetaFields(jsl.Document): class Options(object): additional_properties = True session_key = jsl.StringField(required=True) server_uri = jsl.StringField(required=True) server_host = jsl.StringField(required=True) server_port = jsl.NumberField(required=True)
class Status(JSLSchemaBase): class Options(object): definition_id = "status" description = "Component analyses response status" attributes = jsl.DictField(additional_properties=True) code = jsl.NumberField(required=True) message = jsl.StringField(required=True)
class GithubDetails(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Github information for a single component" definition_id = "component_github_info" forks_count = jsl.NumberField(required=True) stargazers_count = jsl.NumberField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: v2_0_0.issues = jsl.DocumentField(GithubMetrics, as_ref=True, required=True) v2_0_0.pull_requests = jsl.DocumentField(GithubMetrics, as_ref=True, required=True)
class LicenseCount(jsl.Document): class Options(object): description = "Detected license with occurrence count" definition_id = "license_count" count = jsl.NumberField(description="Combined count of detected variants", required=True) license_name = jsl.StringField( description="Common name of the detected license", required=True)
class SimilarStacks(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack Similarity Information" definition_id = "stack_similarity_information" analysis = jsl.DocumentField(SimilarityAnalysis, as_ref=True, required=True) similarity = jsl.NumberField(required=True) stack_id = jsl.NumberField(required=True) uri = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4: v2_1_4.source = jsl.StringField(required=True) v2_1_4.usage = jsl.NumberField(required=True) v2_1_4.original_score = jsl.NumberField(required=True)