Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b73a201
Add NVIDIA DCGM packages and repository support
surajssd Sep 19, 2025
b005a0e
Add error handling and logging to NVIDIA repository setup
surajssd Sep 19, 2025
e537f7a
Fix package name encoding issues in apt_get_download
surajssd Sep 22, 2025
9b3adb9
Add NVIDIA DCGM package installation support
surajssd Sep 24, 2025
5eecdcd
refactor: Consolidate package testing logic using case statement
surajssd Sep 24, 2025
8f20dad
Fix typo in nvidia repo setup and add missing benchmark capture
surajssd Sep 25, 2025
0f48cde
Remove CUDA 12 specific datacenter-gpu-manager packages
surajssd Sep 25, 2025
12d4e4a
Fix trailing whitespace and implement managed GPU experience feature
surajssd Sep 27, 2025
dcdc249
Add e2e tests for NVIDIA DCGM Exporter on Ubuntu 22.04 and 24.04
surajssd Sep 29, 2025
4424199
feat: Rename dcgm-exporter package for Azure Linux
surajssd Oct 2, 2025
f3fd888
test: Add OS-specific logic for GPU manager exporter packages
surajssd Oct 2, 2025
fc7b6fc
Move epoch stripping outside OS-specific conditional
surajssd Oct 2, 2025
a9ac311
test: Improve DCGM exporter validation
surajssd Oct 3, 2025
98f0ee0
Add dcgm-exporter component config
surajssd Oct 3, 2025
4025aee
fix: Escape dots in version for JSON path queries
surajssd Oct 3, 2025
8f2ae5d
Add Azure Linux 3.0 version check for NVIDIA DCGM pkg installation
surajssd Oct 6, 2025
41e3448
feat: Consolidate GPU device plugin and DCGM
surajssd Oct 6, 2025
afd0c76
test: Standardize test function naming with underscores
surajssd Oct 6, 2025
9e49dbf
Refactor function names to use camelCase convention
surajssd Oct 7, 2025
d47fcf7
tests: Consolidate NVIDIA DCGM Exporter tests into device plugin tests
surajssd Oct 8, 2025
2429388
Rename GPU test file to reflect broader scope
surajssd Oct 8, 2025
82006eb
refactor: Narrow Nvidia package updates to DCGM pkg
surajssd Oct 9, 2025
edb3ab7
Add .claude to .gitignore
surajssd Oct 9, 2025
a5f33a6
Rename function from managed_gpu_package_list to managedGPUPackageList
surajssd Oct 10, 2025
831c621
Add CustomData
surajssd Oct 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 42 additions & 1 deletion .github/renovate.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@
"versioning": "regex:^v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-(?<prerelease>\\d+)$",
"ignoreUnstable": false
},

{
"matchDatasources": [
"docker"
Expand Down Expand Up @@ -577,6 +576,20 @@
"versioningTemplate": "deb",
"autoReplaceStringTemplate": "\"renovateTag\": \"name={{{packageName}}}, repository=production, os=ubuntu, release=22.04\",\n \"latestVersion\": \"{{{newValue}}}\"{{#if depType}},\n \"previousLatestVersion\": \"{{{currentValue}}}\"{{/if}}"
},
{
"customType": "regex",
"description": "auto update Nvidia DCGM packages for OS ubuntu 22.04 in components.json",
"managerFilePatterns": [
"/parts/common/components.json/"
],
"matchStringsStrategy": "any",
"matchStrings": [
"\"renovateTag\":\\s*\"name=(?<packageName>datacenter-gpu-manager-4-core|datacenter-gpu-manager-4-proprietary|datacenter-gpu-manager-exporter), repository=nvidia, os=ubuntu, release=22\\.04\",\\s*\"latestVersion\":\\s*\"(?<currentValue>[^\"]+)\"(?:[^}]*\"previousLatestVersion\":\\s*\"(?<depType>[^\"]+)\")?"
],
"datasourceTemplate": "custom.nvidia-deb2204",
"versioningTemplate": "deb",
"autoReplaceStringTemplate": "\"renovateTag\": \"name={{{packageName}}}, repository=nvidia, os=ubuntu, release=22.04\",\n \"latestVersion\": \"{{{newValue}}}\"{{#if depType}},\n \"previousLatestVersion\": \"{{{currentValue}}}\"{{/if}}"
},
{
"customType": "regex",
"description": "auto update packages for OS ubuntu 24.04 in components.json",
Expand All @@ -591,6 +604,20 @@
"versioningTemplate": "deb",
"autoReplaceStringTemplate": "\"renovateTag\": \"name={{{packageName}}}, repository=production, os=ubuntu, release=24.04\",\n \"latestVersion\": \"{{{newValue}}}\"{{#if depType}},\n \"previousLatestVersion\": \"{{{currentValue}}}\"{{/if}}"
},
{
"customType": "regex",
"description": "auto update Nvidia DCGM packages for OS ubuntu 24.04 in components.json",
"managerFilePatterns": [
"/parts/common/components.json/"
],
"matchStringsStrategy": "any",
"matchStrings": [
"\"renovateTag\":\\s*\"name=(?<packageName>datacenter-gpu-manager-4-core|datacenter-gpu-manager-4-proprietary|datacenter-gpu-manager-exporter), repository=nvidia, os=ubuntu, release=24\\.04\",\\s*\"latestVersion\":\\s*\"(?<currentValue>[^\"]+)\"(?:[^}]*\"previousLatestVersion\":\\s*\"(?<depType>[^\"]+)\")?"
],
"datasourceTemplate": "custom.nvidia-deb2404",
"versioningTemplate": "deb",
"autoReplaceStringTemplate": "\"renovateTag\": \"name={{{packageName}}}, repository=nvidia, os=ubuntu, release=24.04\",\n \"latestVersion\": \"{{{newValue}}}\"{{#if depType}},\n \"previousLatestVersion\": \"{{{currentValue}}}\"{{/if}}"
},
{
"customType": "regex",
"description": "auto update packages for OS ubuntu 24.04 (test registry) in components.json",
Expand Down Expand Up @@ -658,13 +685,27 @@
"{\"releases\": $map(($index := releases#$i[version=\"Package: {{packageName}}\"].$i; $map($index, function($i) { $substringAfter(releases[$i + 1].version, \"Version: \") })), function($v) { {\"version\": $v} })[]}"
]
},
"nvidia-deb2204": {
"defaultRegistryUrlTemplate": "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/Packages",
"format": "plain",
"transformTemplates": [
"{\"releases\": $map(($index := releases#$i[version=\"Package: {{packageName}}\"].$i; $map($index, function($i) { $substringAfter(releases[$i + 1].version, \"Version: \") })), function($v) { {\"version\": $v} })[]}"
]
},
"deb2404": {
"defaultRegistryUrlTemplate": "https://packages.microsoft.com/ubuntu/24.04/prod/dists/noble/main/binary-amd64/Packages",
"format": "plain",
"transformTemplates": [
"{\"releases\": $map(($index := releases#$i[version=\"Package: {{packageName}}\"].$i; $map($index, function($i) { $substringAfter(releases[$i + 1].version, \"Version: \") })), function($v) { {\"version\": $v} })[]}"
]
},
"nvidia-deb2404": {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess we are assuming once released in Ubuntu repo it will be available in AzureLinux ?

Copy link
Copy Markdown
Member Author

@surajssd surajssd Sep 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, I understand. What do you mean?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess my question was more around the fact that changes in this files were only for ubuntu, I was wondering is we needed to setup renovate datasource for the azurelinux repos.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is that for the AzureLinux renovate uses the registry URL provided as a part of the components.json file to fetch new update.

"\"renovateTag\":\\s*\"RPM_registry=(?<registryUrl>[^,]+), name=(?<packageName>[^,]+), os=azurelinux, release=3\\.0\",\\s*\"latestVersion\":\\s*\"(?<currentValue>[^\"]+)\"(?:[^}]*\"previousLatestVersion\":\\s*\"(?<depType>[^\"]+)\")?"
],
"datasourceTemplate": "rpm",
"autoReplaceStringTemplate": "\"renovateTag\": \"RPM_registry={{{registryUrl}}}, name={{{packageName}}}, os=azurelinux, release=3.0\",\n \"latestVersion\": \"{{{newValue}}}\"{{#if depType}},\n \"previousLatestVersion\": \"{{{currentValue}}}\"{{/if}}"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so, but I might be wrong here. @Devinwong could confirm.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes for RPM_registry, it will capture the URL provided in the components.json.
But I do have a suggestion here. As this PR involves multiple new rules and components added, it will be great to really test them out, if you haven't yet, to see if Renovate can really create PRs for them automatically, and ensure it doesn't break others (Renovate will complain with warnings/errors)

  • Create this branch in your fork repo and intentionally set the versions in components.json to an older one, e.g. from 4.4.1-1 to 4.4.0 and see if it really works. You will need to onboard your fork to https://developer.mend.io/ so that Renovate can detect your fork.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I often break Renovate when I introduce new rules as Renovate highly relies on the renovate.json correctness and JSON can only be debugged at runtime

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Devinwong the renovate config for the APT packages is working fine, the rpm config has proven problematic. I will sync with you office to move this forward.

"defaultRegistryUrlTemplate": "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/Packages",
"format": "plain",
"transformTemplates": [
"{\"releases\": $map(($index := releases#$i[version=\"Package: {{packageName}}\"].$i; $map($index, function($i) { $substringAfter(releases[$i + 1].version, \"Version: \") })), function($v) { {\"version\": $v} })[]}"
]
},
"deb2404-test": {
"defaultRegistryUrlTemplate": "https://packages.microsoft.com/ubuntu/24.04/prod/dists/testing/main/binary-amd64/Packages",
"format": "plain",
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ vhdbuilder/packer/prefetch.sh
# ignore mise configs (https://mise.jdx.dev/)
.mise

# Ignore AI related configs
.claude
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,25 @@ import (
"github.com/stretchr/testify/require"
)

func getDCGMPackageNames(os string) []string {
packages := []string{
"datacenter-gpu-manager-4-core",
"datacenter-gpu-manager-4-proprietary",
}

switch os {
case "ubuntu":
packages = append(packages, "datacenter-gpu-manager-exporter")
case "azurelinux":
packages = append(packages, "dcgm-exporter")
}

return packages
}

func Test_Ubuntu2404_NvidiaDevicePluginRunning(t *testing.T) {
RunScenario(t, &Scenario{
Description: "Tests that NVIDIA device plugin is running properly after CSE execution on Ubuntu 24.04 GPU nodes",
Description: "Tests that NVIDIA device plugin and DCGM Exporter are running & functional on Ubuntu 24.04 GPU nodes",
Tags: Tags{
GPU: true,
},
Expand All @@ -29,12 +45,18 @@ func Test_Ubuntu2404_NvidiaDevicePluginRunning(t *testing.T) {
},
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {
vmss.SKU.Name = to.Ptr("Standard_NC6s_v3")
if vmss.Tags == nil {
vmss.Tags = map[string]*string{}
}
vmss.Tags["EnableManagedGPUExperience"] = to.Ptr("true")
},
Validator: func(ctx context.Context, s *Scenario) {
os := "ubuntu"
osVersion := "r2404"

// Validate that the NVIDIA device plugin binary was installed correctly
versions := components.GetExpectedPackageVersions("nvidia-device-plugin", "ubuntu", "r2404")
require.Lenf(s.T, versions, 1, "Expected exactly one nvidia-device-plugin version for ubuntu r2404 but got %d", len(versions))
versions := components.GetExpectedPackageVersions("nvidia-device-plugin", os, osVersion)
require.Lenf(s.T, versions, 1, "Expected exactly one nvidia-device-plugin version for %s %s but got %d", os, osVersion, len(versions))
ValidateInstalledPackageVersion(ctx, s, "nvidia-device-plugin", versions[0])

// Validate that the NVIDIA device plugin systemd service is running
Expand All @@ -45,14 +67,25 @@ func Test_Ubuntu2404_NvidiaDevicePluginRunning(t *testing.T) {

// Validate that GPU workloads can be scheduled
ValidateGPUWorkloadSchedulable(ctx, s)

// Validate that the NVIDIA DCGM packages were installed correctly
for _, packageName := range getDCGMPackageNames(os) {
versions := components.GetExpectedPackageVersions(packageName, os, osVersion)
require.Lenf(s.T, versions, 1, "Expected exactly one %s version for %s %s but got %d", packageName, os, osVersion, len(versions))
ValidateInstalledPackageVersion(ctx, s, packageName, versions[0])
}

ValidateNvidiaDCGMExporterSystemDServiceRunning(ctx, s)
ValidateNvidiaDCGMExporterIsScrapable(ctx, s)
ValidateNvidiaDCGMExporterScrapeCommonMetric(ctx, s)
},
},
})
}

func Test_Ubuntu2204_NvidiaDevicePluginRunning(t *testing.T) {
RunScenario(t, &Scenario{
Description: "Tests that NVIDIA device plugin is running properly after CSE execution on Ubuntu 22.04 GPU nodes",
Description: "Tests that NVIDIA device plugin and DCGM Exporter are running & functional on Ubuntu 22.04 GPU nodes",
Tags: Tags{
GPU: true,
},
Expand All @@ -67,12 +100,18 @@ func Test_Ubuntu2204_NvidiaDevicePluginRunning(t *testing.T) {
},
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {
vmss.SKU.Name = to.Ptr("Standard_NC6s_v3")
if vmss.Tags == nil {
vmss.Tags = map[string]*string{}
}
vmss.Tags["EnableManagedGPUExperience"] = to.Ptr("true")
},
Validator: func(ctx context.Context, s *Scenario) {
os := "ubuntu"
osVersion := "r2204"

// Validate that the NVIDIA device plugin binary was installed correctly
versions := components.GetExpectedPackageVersions("nvidia-device-plugin", "ubuntu", "r2204")
require.Lenf(s.T, versions, 1, "Expected exactly one nvidia-device-plugin version for ubuntu r2204 but got %d", len(versions))
versions := components.GetExpectedPackageVersions("nvidia-device-plugin", os, osVersion)
require.Lenf(s.T, versions, 1, "Expected exactly one nvidia-device-plugin version for %s %s but got %d", os, osVersion, len(versions))
ValidateInstalledPackageVersion(ctx, s, "nvidia-device-plugin", versions[0])

// Validate that the NVIDIA device plugin systemd service is running
Expand All @@ -83,14 +122,24 @@ func Test_Ubuntu2204_NvidiaDevicePluginRunning(t *testing.T) {

// Validate that GPU workloads can be scheduled
ValidateGPUWorkloadSchedulable(ctx, s)

for _, packageName := range getDCGMPackageNames(os) {
versions := components.GetExpectedPackageVersions(packageName, os, osVersion)
require.Lenf(s.T, versions, 1, "Expected exactly one %s version for %s %s but got %d", packageName, os, osVersion, len(versions))
ValidateInstalledPackageVersion(ctx, s, packageName, versions[0])
}

ValidateNvidiaDCGMExporterSystemDServiceRunning(ctx, s)
ValidateNvidiaDCGMExporterIsScrapable(ctx, s)
ValidateNvidiaDCGMExporterScrapeCommonMetric(ctx, s)
},
},
})
}

func Test_AzureLinux3_NvidiaDevicePluginRunning(t *testing.T) {
RunScenario(t, &Scenario{
Description: "Tests that NVIDIA device plugin is running properly after CSE execution on Azure Linux V3 GPU nodes",
Description: "Tests that NVIDIA device plugin and DCGM Exporter are running & functional on Azure Linux v3 GPU nodes",
Tags: Tags{
GPU: true,
},
Expand All @@ -105,12 +154,18 @@ func Test_AzureLinux3_NvidiaDevicePluginRunning(t *testing.T) {
},
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {
vmss.SKU.Name = to.Ptr("Standard_NC6s_v3")
if vmss.Tags == nil {
vmss.Tags = map[string]*string{}
}
vmss.Tags["EnableManagedGPUExperience"] = to.Ptr("true")
},
Validator: func(ctx context.Context, s *Scenario) {
os := "azurelinux"
osVersion := "v3.0"

// Validate that the NVIDIA device plugin binary was installed correctly
versions := components.GetExpectedPackageVersions("nvidia-device-plugin", "azurelinux", "v3.0")
require.Lenf(s.T, versions, 1, "Expected exactly one nvidia-device-plugin version for azurelinux 3.0 but got %d", len(versions))
versions := components.GetExpectedPackageVersions("nvidia-device-plugin", os, osVersion)
require.Lenf(s.T, versions, 1, "Expected exactly one nvidia-device-plugin version for %s %s but got %d", os, osVersion, len(versions))
ValidateInstalledPackageVersion(ctx, s, "nvidia-device-plugin", versions[0])

// Validate that the NVIDIA device plugin systemd service is running
Expand All @@ -121,6 +176,16 @@ func Test_AzureLinux3_NvidiaDevicePluginRunning(t *testing.T) {

// Validate that GPU workloads can be scheduled
ValidateGPUWorkloadSchedulable(ctx, s)

for _, packageName := range getDCGMPackageNames(os) {
versions := components.GetExpectedPackageVersions(packageName, os, osVersion)
require.Lenf(s.T, versions, 1, "Expected exactly one %s version for %s %s but got %d", packageName, os, osVersion, len(versions))
ValidateInstalledPackageVersion(ctx, s, packageName, versions[0])
}

ValidateNvidiaDCGMExporterSystemDServiceRunning(ctx, s)
ValidateNvidiaDCGMExporterIsScrapable(ctx, s)
ValidateNvidiaDCGMExporterScrapeCommonMetric(ctx, s)
},
},
})
Expand Down
32 changes: 32 additions & 0 deletions e2e/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -1090,3 +1090,35 @@ fi`)},

s.T.Logf("PubkeyAuthentication is properly disabled as expected")
}

func ValidateNvidiaDCGMExporterSystemDServiceRunning(ctx context.Context, s *Scenario) {
s.T.Helper()
command := []string{
"set -ex",
// Verify nvidia-dcgm service is running
"systemctl is-active nvidia-dcgm",
// Verify nvidia-dcgm-exporter service is running
"systemctl is-active nvidia-dcgm-exporter",
}
execScriptOnVMForScenarioValidateExitCode(ctx, s, strings.Join(command, "\n"), 0, "Nvidia DCGM Exporter service validation failed")
}

func ValidateNvidiaDCGMExporterIsScrapable(ctx context.Context, s *Scenario) {
s.T.Helper()
command := []string{
"set -ex",
// Check if nvidia-dcgm-exporter is scrapable on port 19400
"curl -f http://localhost:19400/metrics",
Comment thread
surajssd marked this conversation as resolved.
}
execScriptOnVMForScenarioValidateExitCode(ctx, s, strings.Join(command, "\n"), 0, "Nvidia DCGM Exporter is not scrapable on port 19400")
}

func ValidateNvidiaDCGMExporterScrapeCommonMetric(ctx context.Context, s *Scenario) {
s.T.Helper()
command := []string{
"set -ex",
// Verify the most universal GPU metric is present
"curl -s http://localhost:19400/metrics | grep -q 'DCGM_FI_DEV_GPU_UTIL'",
}
execScriptOnVMForScenarioValidateExitCode(ctx, s, strings.Join(command, "\n"), 0, "Nvidia DCGM Exporter is not returning DCGM_FI_DEV_GPU_UTIL")
}
108 changes: 108 additions & 0 deletions parts/common/components.json
Original file line number Diff line number Diff line change
Expand Up @@ -1510,6 +1510,114 @@
}
}
}
},
{
"name": "datacenter-gpu-manager-4-core",
"downloadLocation": "/opt/datacenter-gpu-manager-4-core/downloads",
"downloadURIs": {
"ubuntu": {
"r2404": {
"versionsV2": [
{
"renovateTag": "name=datacenter-gpu-manager-4-core, repository=nvidia, os=ubuntu, release=24.04",
"latestVersion": "1:4.4.1-1"
}
]
},
"r2204": {
"versionsV2": [
{
"renovateTag": "name=datacenter-gpu-manager-4-core, repository=nvidia, os=ubuntu, release=22.04",
"latestVersion": "1:4.4.1-1"
}
]
}
},
"azurelinux": {
"v3.0": {
"versionsV2": [
{
"renovateTag": "RPM_registry=https://developer.download.nvidia.com/compute/cuda/repos/azl3/x86_64/repodata, name=datacenter-gpu-manager-4-core, repository=nvidia, os=azurelinux, release=3.0",
Comment thread
djsly marked this conversation as resolved.
"latestVersion": "1:4.4.1-1"
}
]
}
}
}
},
{
"name": "datacenter-gpu-manager-4-proprietary",
"downloadLocation": "/opt/datacenter-gpu-manager-4-proprietary/downloads",
"downloadURIs": {
"ubuntu": {
"r2404": {
"versionsV2": [
{
"renovateTag": "name=datacenter-gpu-manager-4-proprietary, repository=nvidia, os=ubuntu, release=24.04",
"latestVersion": "1:4.4.1-1"
}
]
},
"r2204": {
"versionsV2": [
{
"renovateTag": "name=datacenter-gpu-manager-4-proprietary, repository=nvidia, os=ubuntu, release=22.04",
"latestVersion": "1:4.4.1-1"
}
]
}
},
"azurelinux": {
"v3.0": {
"versionsV2": [
{
"renovateTag": "RPM_registry=https://developer.download.nvidia.com/compute/cuda/repos/azl3/x86_64/repodata, name=datacenter-gpu-manager-4-proprietary, repository=nvidia, os=azurelinux, release=3.0",
"latestVersion": "1:4.4.1-1"
}
]
}
}
}
},
{
"name": "datacenter-gpu-manager-exporter",
"downloadLocation": "/opt/datacenter-gpu-manager-exporter/downloads",
"downloadURIs": {
"ubuntu": {
"r2404": {
"versionsV2": [
{
"renovateTag": "name=datacenter-gpu-manager-exporter, repository=nvidia, os=ubuntu, release=24.04",
"latestVersion": "4.5.2-1"
}
]
},
"r2204": {
"versionsV2": [
{
"renovateTag": "name=datacenter-gpu-manager-exporter, repository=nvidia, os=ubuntu, release=22.04",
"latestVersion": "4.5.2-1"
}
]
}
}
}
},
{
"name": "dcgm-exporter",
"downloadLocation": "/opt/dcgm-exporter/downloads",
"downloadURIs": {
"azurelinux": {
"v3.0": {
"versionsV2": [
{
"renovateTag": "RPM_registry=https://packages.microsoft.com/azurelinux/3.0/prod/cloud-native/x86_64/repodata, name=dcgm-exporter, os=azurelinux, release=3.0",
"latestVersion": "4.5.2-1.azl3"
}
]
}
}
}
}
],
"OCIArtifacts": [
Expand Down
Loading
Loading