datasource: remove packer-image-iteration

The `packer-image-iteration' datasource is an undocumented, and
unexported datasource, so it cannot be used by clients.

Since this is dead weight, we can remove it safely from the codebase.
This commit is contained in:
Lucas Bajolet 2022-11-14 17:01:53 -05:00 committed by Lucas Bajolet
parent ccb5a22bb4
commit 338c95b2eb
12 changed files with 0 additions and 512 deletions

View file

@ -1,208 +0,0 @@
//go:generate packer-sdc struct-markdown
//go:generate packer-sdc mapstructure-to-hcl2 -type DatasourceOutput,Config,ParBuild,ParImage
package packer_image_iteration
import (
"context"
"fmt"
"log"
"time"
"github.com/zclconf/go-cty/cty"
"github.com/hashicorp/hcl/v2/hcldec"
"github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2021-04-30/models"
"github.com/hashicorp/packer-plugin-sdk/common"
"github.com/hashicorp/packer-plugin-sdk/hcl2helper"
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
"github.com/hashicorp/packer-plugin-sdk/template/config"
hcpapi "github.com/hashicorp/packer/internal/hcp/api"
)
// Type for Packer datasource has been renamed temporarily to prevent it from being
// automatically registered as a viable datasource plugin in command/plugin.go.
// In the future this type will be renamed to allow for the use of the datasource.
type DeactivatedDatasource struct {
config Config
}
type Config struct {
common.PackerConfig `mapstructure:",squash"`
// The name of the bucket your image is in.
Bucket string `mapstructure:"bucket_name" required:"true"`
// The name of the channel to use when retrieving your image
Channel string `mapstructure:"channel" required:"true"`
// TODO: Version string `mapstructure:"version"`
// TODO: Label string `mapstructure:"label"`
}
func (d *DeactivatedDatasource) ConfigSpec() hcldec.ObjectSpec {
return d.config.FlatMapstructure().HCL2Spec()
}
func (d *DeactivatedDatasource) Configure(raws ...interface{}) error {
err := config.Decode(&d.config, nil, raws...)
if err != nil {
return err
}
var errs *packersdk.MultiError
if d.config.Bucket == "" {
errs = packersdk.MultiErrorAppend(errs, fmt.Errorf("The `bucket_name` must be specified"))
}
if d.config.Channel == "" {
errs = packersdk.MultiErrorAppend(errs, fmt.Errorf("`channel` is currently a required field."))
}
if errs != nil && len(errs.Errors) > 0 {
return errs
}
return nil
}
// Copy of []*models.HashicorpCloudPackerBuild. Need to copy so we can generate
// the HCL spec.
type ParBuild struct {
// The name of the cloud provider that the build exists in. For example,
// "aws", "azure", or "gce".
CloudProvider string `mapstructure:"cloud_provider"`
// The specific Packer builder or post-processor used to create the build.
ComponentType string `mapstructure:"component_type"`
// The date and time at which the build was run.
CreatedAt string `mapstructure:"created_at"`
// The build ID. This is a ULID, which is a unique identifier similar
// to a UUID. It is created by the HCP Packer Registry when an build is
// first created, and is unique to this build.
ID string `mapstructure:"id"`
// A list of images as stored in the HCP Packer registry. See the ParImage
// docs for more information.
Images []ParImage `mapstructure:"images"`
// The iteration ID. This is a ULID, which is a unique identifier similar
// to a UUID. It is created by the HCP Packer Registry when an iteration is
// first created, and is unique to this iteration.
IterationID string `mapstructure:"iteration_id"`
// Unstructured key:value metadata associated with the build.
Labels map[string]string `mapstructure:"labels"`
// The UUID associated with the Packer run that created this build.
PackerRunUUID string `mapstructure:"packer_run_uuid"`
// Whether the build is considered "complete" (the Packer build ran
// successfully and created an artifact), or "incomplete" (the Packer
// build did not finish, and there is no uploaded artifact).
Status string `mapstructure:"status"`
// The date and time at which the build was last updated.
UpdatedAt string `mapstructure:"updated_at"`
}
// Copy of []*models.HashicorpCloudPackerImage Need to copy so we can generate
// the HCL spec.
type ParImage struct {
// The date and time at which the build was last updated.
CreatedAt string `mapstructure:"created_at,omitempty"`
// The iteration ID. This is a ULID, which is a unique identifier similar
// to a UUID. It is created by the HCP Packer Registry when an iteration is
// first created, and is unique to this iteration.
ID string `mapstructure:"id,omitempty"`
// ID or URL of the remote cloud image as given by a build.
ImageID string `mapstructure:"image_id,omitempty"`
// The cloud region as given by `packer build`. eg. "ap-east-1".
// For locally managed clouds, this may map instead to a cluster, server
// or datastore.
Region string `mapstructure:"region,omitempty"`
}
type DatasourceOutput struct {
// The iteration ID. This is a ULID, which is a unique identifier similar
// to a UUID. It is created by the HCP Packer Registry when an iteration is
// first created, and is unique to this iteration.
Id string `mapstructure:"Id"`
// The version number assigned to an iteration. This number is an integer,
// and is created by the HCP Packer Registry once an iteration is
// marked "complete". If a new iteration is marked "complete", the version
// that HCP Packer assigns to it will always be the highest previous
// iteration version plus one.
IncrementalVersion int32 `mapstructure:"incremental_version"`
// The date the iteration was created.
CreatedAt string `mapstructure:"created_at"`
// A list of builds that are stored in the iteration. These builds can be
// parsed using HCL to find individual image IDs for specific providers.
Builds []ParBuild `mapstructure:"builds"`
}
func (d *DeactivatedDatasource) OutputSpec() hcldec.ObjectSpec {
return (&DatasourceOutput{}).FlatMapstructure().HCL2Spec()
}
func (d *DeactivatedDatasource) Execute() (cty.Value, error) {
ctx := context.TODO()
cli, err := hcpapi.NewClient()
if err != nil {
return cty.NullVal(cty.EmptyObject), err
}
// Load channel.
log.Printf("[INFO] Reading info from HCP Packer registry (%s) [project_id=%s, organization_id=%s, channel=%s]",
d.config.Bucket, cli.ProjectID, cli.OrganizationID, d.config.Channel)
channel, err := cli.GetChannel(ctx, d.config.Bucket, d.config.Channel)
if err != nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf("error retrieving "+
"channel from HCP Packer registry: %s", err.Error())
}
var iteration *models.HashicorpCloudPackerIteration
if channel != nil {
if channel.Iteration != nil {
iteration = channel.Iteration
}
return cty.NullVal(cty.EmptyObject), fmt.Errorf("there is no iteration associated with the channel %s",
d.config.Channel)
}
revokeAt := time.Time(iteration.RevokeAt)
if !revokeAt.IsZero() && revokeAt.Before(time.Now().UTC()) {
// If RevokeAt is not a zero date and is before NOW, it means this iteration is revoked and should not be used
// to build new images.
return cty.NullVal(cty.EmptyObject), fmt.Errorf("the iteration associated with the channel %s is revoked and can not be used on Packer builds",
d.config.Channel)
}
output := DatasourceOutput{
IncrementalVersion: iteration.IncrementalVersion,
CreatedAt: iteration.CreatedAt.String(),
Builds: convertPackerBuildList(iteration.Builds),
}
return hcl2helper.HCL2ValueFromConfig(output, d.OutputSpec()), nil
}
func convertPackerBuildList(builds []*models.HashicorpCloudPackerBuild) (flattened []ParBuild) {
for _, build := range builds {
out := ParBuild{
CloudProvider: build.CloudProvider,
ComponentType: build.ComponentType,
CreatedAt: build.CreatedAt.String(),
ID: build.ID,
Images: convertPackerBuildImagesList(build.Images),
Labels: build.Labels,
PackerRunUUID: build.PackerRunUUID,
Status: string(build.Status),
UpdatedAt: build.UpdatedAt.String(),
}
flattened = append(flattened, out)
}
return
}
func convertPackerBuildImagesList(images []*models.HashicorpCloudPackerImage) (flattened []ParImage) {
for _, image := range images {
out := ParImage{
CreatedAt: image.CreatedAt.String(),
ID: image.ID,
ImageID: image.ImageID,
Region: image.Region,
}
flattened = append(flattened, out)
}
return
}

View file

@ -1,148 +0,0 @@
// Code generated by "packer-sdc mapstructure-to-hcl2"; DO NOT EDIT.
package packer_image_iteration
import (
"github.com/hashicorp/hcl/v2/hcldec"
"github.com/zclconf/go-cty/cty"
)
// FlatConfig is an auto-generated flat version of Config.
// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up.
type FlatConfig struct {
PackerBuildName *string `mapstructure:"packer_build_name" cty:"packer_build_name" hcl:"packer_build_name"`
PackerBuilderType *string `mapstructure:"packer_builder_type" cty:"packer_builder_type" hcl:"packer_builder_type"`
PackerCoreVersion *string `mapstructure:"packer_core_version" cty:"packer_core_version" hcl:"packer_core_version"`
PackerDebug *bool `mapstructure:"packer_debug" cty:"packer_debug" hcl:"packer_debug"`
PackerForce *bool `mapstructure:"packer_force" cty:"packer_force" hcl:"packer_force"`
PackerOnError *string `mapstructure:"packer_on_error" cty:"packer_on_error" hcl:"packer_on_error"`
PackerUserVars map[string]string `mapstructure:"packer_user_variables" cty:"packer_user_variables" hcl:"packer_user_variables"`
PackerSensitiveVars []string `mapstructure:"packer_sensitive_variables" cty:"packer_sensitive_variables" hcl:"packer_sensitive_variables"`
Bucket *string `mapstructure:"bucket_name" required:"true" cty:"bucket_name" hcl:"bucket_name"`
Channel *string `mapstructure:"channel" required:"true" cty:"channel" hcl:"channel"`
}
// FlatMapstructure returns a new FlatConfig.
// FlatConfig is an auto-generated flat version of Config.
// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up.
func (*Config) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } {
return new(FlatConfig)
}
// HCL2Spec returns the hcl spec of a Config.
// This spec is used by HCL to read the fields of Config.
// The decoded values from this spec will then be applied to a FlatConfig.
func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec {
s := map[string]hcldec.Spec{
"packer_build_name": &hcldec.AttrSpec{Name: "packer_build_name", Type: cty.String, Required: false},
"packer_builder_type": &hcldec.AttrSpec{Name: "packer_builder_type", Type: cty.String, Required: false},
"packer_core_version": &hcldec.AttrSpec{Name: "packer_core_version", Type: cty.String, Required: false},
"packer_debug": &hcldec.AttrSpec{Name: "packer_debug", Type: cty.Bool, Required: false},
"packer_force": &hcldec.AttrSpec{Name: "packer_force", Type: cty.Bool, Required: false},
"packer_on_error": &hcldec.AttrSpec{Name: "packer_on_error", Type: cty.String, Required: false},
"packer_user_variables": &hcldec.AttrSpec{Name: "packer_user_variables", Type: cty.Map(cty.String), Required: false},
"packer_sensitive_variables": &hcldec.AttrSpec{Name: "packer_sensitive_variables", Type: cty.List(cty.String), Required: false},
"bucket_name": &hcldec.AttrSpec{Name: "bucket_name", Type: cty.String, Required: false},
"channel": &hcldec.AttrSpec{Name: "channel", Type: cty.String, Required: false},
}
return s
}
// FlatDatasourceOutput is an auto-generated flat version of DatasourceOutput.
// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up.
type FlatDatasourceOutput struct {
Id *string `mapstructure:"Id" cty:"Id" hcl:"Id"`
IncrementalVersion *int32 `mapstructure:"incremental_version" cty:"incremental_version" hcl:"incremental_version"`
CreatedAt *string `mapstructure:"created_at" cty:"created_at" hcl:"created_at"`
Builds []FlatParBuild `mapstructure:"builds" cty:"builds" hcl:"builds"`
}
// FlatMapstructure returns a new FlatDatasourceOutput.
// FlatDatasourceOutput is an auto-generated flat version of DatasourceOutput.
// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up.
func (*DatasourceOutput) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } {
return new(FlatDatasourceOutput)
}
// HCL2Spec returns the hcl spec of a DatasourceOutput.
// This spec is used by HCL to read the fields of DatasourceOutput.
// The decoded values from this spec will then be applied to a FlatDatasourceOutput.
func (*FlatDatasourceOutput) HCL2Spec() map[string]hcldec.Spec {
s := map[string]hcldec.Spec{
"Id": &hcldec.AttrSpec{Name: "Id", Type: cty.String, Required: false},
"incremental_version": &hcldec.AttrSpec{Name: "incremental_version", Type: cty.Number, Required: false},
"created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false},
"builds": &hcldec.BlockListSpec{TypeName: "builds", Nested: hcldec.ObjectSpec((*FlatParBuild)(nil).HCL2Spec())},
}
return s
}
// FlatParBuild is an auto-generated flat version of ParBuild.
// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up.
type FlatParBuild struct {
CloudProvider *string `mapstructure:"cloud_provider" cty:"cloud_provider" hcl:"cloud_provider"`
ComponentType *string `mapstructure:"component_type" cty:"component_type" hcl:"component_type"`
CreatedAt *string `mapstructure:"created_at" cty:"created_at" hcl:"created_at"`
ID *string `mapstructure:"id" cty:"id" hcl:"id"`
Images []FlatParImage `mapstructure:"images" cty:"images" hcl:"images"`
IterationID *string `mapstructure:"iteration_id" cty:"iteration_id" hcl:"iteration_id"`
Labels map[string]string `mapstructure:"labels" cty:"labels" hcl:"labels"`
PackerRunUUID *string `mapstructure:"packer_run_uuid" cty:"packer_run_uuid" hcl:"packer_run_uuid"`
Status *string `mapstructure:"status" cty:"status" hcl:"status"`
UpdatedAt *string `mapstructure:"updated_at" cty:"updated_at" hcl:"updated_at"`
}
// FlatMapstructure returns a new FlatParBuild.
// FlatParBuild is an auto-generated flat version of ParBuild.
// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up.
func (*ParBuild) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } {
return new(FlatParBuild)
}
// HCL2Spec returns the hcl spec of a ParBuild.
// This spec is used by HCL to read the fields of ParBuild.
// The decoded values from this spec will then be applied to a FlatParBuild.
func (*FlatParBuild) HCL2Spec() map[string]hcldec.Spec {
s := map[string]hcldec.Spec{
"cloud_provider": &hcldec.AttrSpec{Name: "cloud_provider", Type: cty.String, Required: false},
"component_type": &hcldec.AttrSpec{Name: "component_type", Type: cty.String, Required: false},
"created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false},
"id": &hcldec.AttrSpec{Name: "id", Type: cty.String, Required: false},
"images": &hcldec.BlockListSpec{TypeName: "images", Nested: hcldec.ObjectSpec((*FlatParImage)(nil).HCL2Spec())},
"iteration_id": &hcldec.AttrSpec{Name: "iteration_id", Type: cty.String, Required: false},
"labels": &hcldec.AttrSpec{Name: "labels", Type: cty.Map(cty.String), Required: false},
"packer_run_uuid": &hcldec.AttrSpec{Name: "packer_run_uuid", Type: cty.String, Required: false},
"status": &hcldec.AttrSpec{Name: "status", Type: cty.String, Required: false},
"updated_at": &hcldec.AttrSpec{Name: "updated_at", Type: cty.String, Required: false},
}
return s
}
// FlatParImage is an auto-generated flat version of ParImage.
// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up.
type FlatParImage struct {
CreatedAt *string `mapstructure:"created_at,omitempty" cty:"created_at" hcl:"created_at"`
ID *string `mapstructure:"id,omitempty" cty:"id" hcl:"id"`
ImageID *string `mapstructure:"image_id,omitempty" cty:"image_id" hcl:"image_id"`
Region *string `mapstructure:"region,omitempty" cty:"region" hcl:"region"`
}
// FlatMapstructure returns a new FlatParImage.
// FlatParImage is an auto-generated flat version of ParImage.
// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up.
func (*ParImage) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } {
return new(FlatParImage)
}
// HCL2Spec returns the hcl spec of a ParImage.
// This spec is used by HCL to read the fields of ParImage.
// The decoded values from this spec will then be applied to a FlatParImage.
func (*FlatParImage) HCL2Spec() map[string]hcldec.Spec {
s := map[string]hcldec.Spec{
"created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false},
"id": &hcldec.AttrSpec{Name: "id", Type: cty.String, Required: false},
"image_id": &hcldec.AttrSpec{Name: "image_id", Type: cty.String, Required: false},
"region": &hcldec.AttrSpec{Name: "region", Type: cty.String, Required: false},
}
return s
}

View file

@ -1,54 +0,0 @@
---
description: |
The Packer Image Iteration Data Source retrieves information about an
iteration from the HCP Packer registry. This information can be parsed to
provide a source image to various Packer builders.
page_title: Packer Image Iteration - Data Sources
---
<BadgesHeader>
<PluginBadge type="official" />
<PluginBadge type="hcp_packer_ready" />
</BadgesHeader>
# Packer Image Iteration Data Source
Type: `packer-image-iteration`
The `Packer Image Iteration` Data Source retrieves information about an
iteration from the HCP Packer registry. This information can be parsed to
provide a source image to various Packer builders.
To get started with HCP Packer, refer to the [HCP Packer documentation](https://cloud.hashicorp.com/docs/packer) or try the [Get Started with HCP Packer tutorials](https://learn.hashicorp.com/collections/packer/hcp-get-started).
~> **Note:** You will receive an error if you try to reference metadata from a deactivated or deleted registry. An administrator can manually deactivate or delete a registry, and HCP Packer automatically deactivates registries with billing issues. Contact [HashiCorp Support](https://support.hashicorp.com/) with questions.
## Revoked Iterations
If an iteration is revoked, the `hcp-packer-iteration` data source will fail and Packer won't proceed with the build. Building new images from a revoked image is not compliant.
Iterations that are scheduled to be revoked will still be considered valid until the revocation date.
## Basic Example
Below is a fully functioning example. It stores information about an image
iteration, which can then be parsed and accessed using HCL tools.
```hcl
data "packer-image-iteration" "hardened-source" {
bucket = "hardened-ubuntu-16-04"
channel = "production-stable"
}
```
## Configuration Reference
Configuration options are organized below into two categories: required and
optional. Within each category, the available options are alphabetized and
described.
### Required:
@include 'datasource/packer-image-iteration/Config-required.mdx'
There are currently no optional fields for this datasource, though we intend
to add filtering fields in the future.

View file

@ -1,7 +0,0 @@
<!-- Code generated from the comments of the Config struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
- `bucket_name` (string) - The name of the bucket your image is in.
- `channel` (string) - The name of the channel to use when retrieving your image
<!-- End of code generated from the comments of the Config struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,7 +0,0 @@
<!-- Code generated from the comments of the Config struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
- `bucket_name` (string) - The name of the bucket your image is in.
- `channel` (string) - The name of the channel to use when retrieving your image
<!-- End of code generated from the comments of the Config struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,18 +0,0 @@
<!-- Code generated from the comments of the DatasourceOutput struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
- `Id` (string) - The iteration ID. This is a ULID, which is a unique identifier similar
to a UUID. It is created by the HCP Packer Registry when an iteration is
first created, and is unique to this iteration.
- `incremental_version` (int32) - The version number assigned to an iteration. This number is an integer,
and is created by the HCP Packer Registry once an iteration is
marked "complete". If a new iteration is marked "complete", the version
that HCP Packer assigns to it will always be the highest previous
iteration version plus one.
- `created_at` (string) - The date the iteration was created.
- `builds` ([]ParBuild) - A list of builds that are stored in the iteration. These builds can be
parsed using HCL to find individual image IDs for specific providers.
<!-- End of code generated from the comments of the DatasourceOutput struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,7 +0,0 @@
<!-- Code generated from the comments of the DeactivatedDatasource struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
Type for Packer datasource has been renamed temporarily to prevent it from being
automatically registered as a viable datasource plugin in command/plugin.go.
In the future this type will be renamed to allow for the use of the datasource.
<!-- End of code generated from the comments of the DeactivatedDatasource struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,31 +0,0 @@
<!-- Code generated from the comments of the ParBuild struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
- `cloud_provider` (string) - The name of the cloud provider that the build exists in. For example,
"aws", "azure", or "gce".
- `component_type` (string) - The specific Packer builder or post-processor used to create the build.
- `created_at` (string) - The date and time at which the build was run.
- `id` (string) - The build ID. This is a ULID, which is a unique identifier similar
to a UUID. It is created by the HCP Packer Registry when an build is
first created, and is unique to this build.
- `images` ([]ParImage) - A list of images as stored in the HCP Packer registry. See the ParImage
docs for more information.
- `iteration_id` (string) - The iteration ID. This is a ULID, which is a unique identifier similar
to a UUID. It is created by the HCP Packer Registry when an iteration is
first created, and is unique to this iteration.
- `labels` (map[string]string) - Unstructured key:value metadata associated with the build.
- `packer_run_uuid` (string) - The UUID associated with the Packer run that created this build.
- `status` (string) - Whether the build is considered "complete" (the Packer build ran
successfully and created an artifact), or "incomplete" (the Packer
build did not finish, and there is no uploaded artifact).
- `updated_at` (string) - The date and time at which the build was last updated.
<!-- End of code generated from the comments of the ParBuild struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,6 +0,0 @@
<!-- Code generated from the comments of the ParBuild struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
Copy of []*models.HashicorpCloudPackerBuild. Need to copy so we can generate
the HCL spec.
<!-- End of code generated from the comments of the ParBuild struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,15 +0,0 @@
<!-- Code generated from the comments of the ParImage struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
- `created_at` (string) - The date and time at which the build was last updated.
- `id` (string) - The iteration ID. This is a ULID, which is a unique identifier similar
to a UUID. It is created by the HCP Packer Registry when an iteration is
first created, and is unique to this iteration.
- `image_id` (string) - ID or URL of the remote cloud image as given by a build.
- `region` (string) - The cloud region as given by `packer build`. eg. "ap-east-1".
For locally managed clouds, this may map instead to a cluster, server
or datastore.
<!-- End of code generated from the comments of the ParImage struct in datasource/packer-image-iteration/data.go; -->

View file

@ -1,6 +0,0 @@
<!-- Code generated from the comments of the ParImage struct in datasource/packer-image-iteration/data.go; DO NOT EDIT MANUALLY -->
Copy of []*models.HashicorpCloudPackerImage Need to copy so we can generate
the HCL spec.
<!-- End of code generated from the comments of the ParImage struct in datasource/packer-image-iteration/data.go; -->

View file

@ -732,11 +732,6 @@
{
"title": "Image",
"path": "datasources/hcp/hcp-packer-image"
},
{
"title": "Image-Deprecated",
"path": "datasources/hcp/packer-image-iteration",
"hidden": true
}
]
},