Skip to content

Commit 87b4407

Browse files
YasenTYasen Trahnov
andauthored
Vulnerability (#6)
* Cleanup, enable list/show/upload for vulnerability subcommand --------- Co-authored-by: Yasen Trahnov <[email protected]>
1 parent 2363669 commit 87b4407

File tree

11 files changed

+117
-378
lines changed

11 files changed

+117
-378
lines changed

MANIFEST.in

Whitespace-only changes.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.1.0.dev"
1+
__version__ = "0.1.1.dev"
Lines changed: 25 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,33 @@
1+
import typing as t
12
from gettext import gettext as _
23

3-
from pulp_glue.common.context import (
4-
EntityDefinition,
5-
PluginRequirement,
6-
PulpContentContext,
7-
PulpEntityContext,
8-
PulpRemoteContext,
9-
PulpRepositoryContext,
10-
PulpRepositoryVersionContext,
11-
)
4+
from pulp_glue.common.context import PulpEntityContext
125

136

14-
class PulpConsoleContentContext(PulpContentContext):
15-
"""Context for Console Content."""
7+
class PulpVulnerabilityReportContext(PulpEntityContext):
8+
"""Context for working with vulnerability reports."""
169

17-
PLUGIN = "console"
18-
RESOURCE_TYPE = "content"
19-
ENTITY = _("console content")
20-
ENTITIES = _("console content")
21-
HREF = "console_console_content_href"
22-
ID_PREFIX = "content_console_content"
23-
NEEDS_PLUGINS = [PluginRequirement("console", specifier=">=1.0.0")]
10+
ENTITY = _("vulnerability report")
11+
ENTITIES = _("vulnerability reports")
12+
ID_PREFIX = "vuln_report"
13+
HREF = "service_vulnerability_report_href"
2414

15+
def upload(self, file: t.IO[bytes], chunk_size: int = 1000000) -> t.Dict[str, t.Any]:
16+
"""Upload a vulnerability report from a JSON file.
2517
26-
class PulpConsoleDistributionContext(PulpEntityContext):
27-
"""Context for Console Distribution."""
18+
Args:
19+
file: The file object to upload
20+
chunk_size: The chunk size for the upload
2821
29-
PLUGIN = "console"
30-
RESOURCE_TYPE = "console"
31-
ENTITY = _("console distribution")
32-
ENTITIES = _("console distributions")
33-
HREF = "console_console_distribution_href"
34-
ID_PREFIX = "distributions_console_console"
35-
NEEDS_PLUGINS = [PluginRequirement("console", specifier=">=1.0.0")]
36-
37-
def preprocess_entity(self, body: EntityDefinition, partial: bool = False) -> EntityDefinition:
38-
body = super().preprocess_entity(body, partial)
39-
version = body.pop("version", None)
40-
if version is not None:
41-
repository_href = body.pop("repository")
42-
body["repository_version"] = f"{repository_href}versions/{version}/"
43-
return body
44-
45-
46-
class PulpConsoleRemoteContext(PulpRemoteContext):
47-
"""Context for Console Remote."""
48-
49-
PLUGIN = "console"
50-
RESOURCE_TYPE = "console"
51-
ENTITY = _("console remote")
52-
ENTITIES = _("console remotes")
53-
HREF = "console_console_remote_href"
54-
ID_PREFIX = "remotes_console_console"
55-
NEEDS_PLUGINS = [PluginRequirement("console", specifier=">=1.0.0")]
56-
57-
58-
class PulpConsoleRepositoryVersionContext(PulpRepositoryVersionContext):
59-
"""Context for Console Repository Version."""
60-
61-
PLUGIN = "console"
62-
RESOURCE_TYPE = "console"
63-
HREF = "console_console_repository_version_href"
64-
ID_PREFIX = "repositories_console_console_versions"
65-
NEEDS_PLUGINS = [PluginRequirement("console", specifier=">=1.0.0")]
66-
67-
68-
class PulpConsoleRepositoryContext(PulpRepositoryContext):
69-
"""Context for Console Repository."""
70-
71-
PLUGIN = "console"
72-
RESOURCE_TYPE = "console"
73-
HREF = "console_console_repository_href"
74-
ID_PREFIX = "repositories_console_console"
75-
VERSION_CONTEXT = PulpConsoleRepositoryVersionContext
76-
NEEDS_PLUGINS = [PluginRequirement("console", specifier=">=1.0.0")]
77-
CAPABILITIES = {
78-
"sync": [PluginRequirement("console", specifier=">=1.0.0")],
79-
}
80-
81-
# Add custom methods for your repository operations here
82-
# For example:
83-
# def import_content(self, href: str, artifact: str, ...) -> Any:
84-
# body = {...}
85-
# return self.pulp_ctx.call("your_import_method_id",
86-
# parameters={self.HREF: href},
87-
# body=body)
22+
Returns:
23+
The created vulnerability report entity
24+
"""
25+
# Read the raw file content
26+
file_content = file.read()
27+
# Submit the file content to the Pulp API
28+
response = self.pulp_ctx.call(
29+
operation_id="vuln_report_create",
30+
body={"package_json": file_content},
31+
validate_body=False,
32+
)
33+
return t.cast(t.Dict[str, t.Any], response)

pulpcore/cli/__init__.py

Whitespace-only changes.

pulpcore/cli/console/__init__.py

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,40 @@
1-
from typing import Any
1+
import json
2+
import typing as t
23

34
import click
4-
from pulp_glue.common.i18n import get_translation
5-
from pulpcore.cli.common.generic import pulp_group
6-
7-
from pulpcore.cli.console.distribution import distribution
8-
from pulpcore.cli.console.remote import remote
9-
from pulpcore.cli.console.repository import repository
10-
11-
translation = get_translation(__package__)
12-
_ = translation.gettext
13-
14-
__version__ = "0.1.0.dev"
15-
16-
17-
@pulp_group("console")
18-
def console_group() -> None:
19-
"""Manage Console plugin."""
20-
pass
21-
22-
23-
def mount(main: click.Group, **kwargs: Any) -> None:
24-
"""Mount the console commands to the CLI."""
25-
console_group.add_command(distribution)
26-
console_group.add_command(remote)
27-
console_group.add_command(repository)
28-
main.add_command(console_group)
5+
from pulp_glue.common.openapi import OpenAPI
6+
7+
8+
def mount(main: click.Group, **kwargs: t.Any) -> None:
9+
if hasattr(OpenAPI, "_parse_response"):
10+
original_parse_response = OpenAPI._parse_response
11+
parse_response_attr = "_parse_response"
12+
else:
13+
original_parse_response = OpenAPI.parse_response # type: ignore[attr-defined]
14+
parse_response_attr = "parse_response"
15+
16+
# Define our custom implementation that handles 202 responses (Original one throws an error)
17+
def custom_parse_response(
18+
self: OpenAPI, method_spec: t.Dict[str, t.Any], response: t.Any
19+
) -> t.Any:
20+
# Handle 202 responses directly
21+
if response.status_code == 202:
22+
content_type = response.headers.get("content-type")
23+
if content_type is not None and content_type.startswith("application/json"):
24+
return json.loads(response.body)
25+
return {"status": "accepted"}
26+
27+
# For all other responses, use the original implementation
28+
return original_parse_response(self, method_spec, response)
29+
30+
setattr(OpenAPI, parse_response_attr, custom_parse_response)
31+
32+
# Continue with normal mounting
33+
from pulpcore.cli.console.vulnerability import attach_vulnerability_commands
34+
35+
@main.group()
36+
def console() -> None:
37+
"""Pulp Console commands."""
38+
pass
39+
40+
attach_vulnerability_commands(console) # type: ignore

pulpcore/cli/console/distribution.py

Lines changed: 0 additions & 119 deletions
This file was deleted.

pulpcore/cli/console/py.typed

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# This file exists to mark this package as having type annotations

pulpcore/cli/console/remote.py

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)