Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Linode Image Data Source #209

Merged
Merged
4 changes: 2 additions & 2 deletions .github/workflows/go-test-multiplatform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
go-version: ${{ needs.get-go-version.outputs.go-version }}
- run: |
echo "Testing with Go ${{ needs.get-go-version.outputs.go-version }}"
go test -race -count 1 ./builder/linode/... -timeout=3m -v
go test -race -count 1 ./... -timeout=3m -v

windows-go-tests:
needs:
Expand All @@ -55,7 +55,7 @@ jobs:
# Running unit tests directly with `go test` due to gofmt/gofumpt issues in Windows
- run: |
echo "Testing with Go ${{ needs.get-go-version.outputs.go-version }}"
go test -race -count 1 ./builder/linode/... -timeout=3m -v
go test -race -count 1 ./... -timeout=3m -v

linux-go-tests:
needs:
Expand Down
108 changes: 108 additions & 0 deletions .web-docs/components/data-source/image/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
Type: `linode-image`

The Linode Image data source matches or filters the ID or label of both public images on
Linode and private images in your account using regular expression (regex) or an exact
match.

You can get the latest list of available public images on Linode via the
[Linode Image List API](https://www.linode.com/docs/api/images/#images-list).

## Examples

```hcl
data "linode-image" "latest_ubuntu" {
id_regex = "linode/ubuntu.*"
latest = true
}

source "linode" "example" {
image = linode-image.latest_ubuntu.id
image_description = "My Private Image"
image_label = "my-packaer-private-linode-image-test"
instance_label = "temporary-linode-image"
instance_type = "g6-nanode-1"
region = "us-mia"
ssh_username = "root"
}

build {
sources = ["source.linode.example"]
}
```

```hcl
data "linode-image" "latest_ubuntu_lts" {
label_regex = "Ubuntu [0-9]+\\.[0-9]+ LTS"
latest = true
}
```

```hcl
data "linode-image" "ubuntu22_lts" {
id = "linode/ubuntu22.04"
latest = true
}
```

## Configuration Reference:

<!-- Code generated from the comments of the Config struct in datasource/image/data.go; DO NOT EDIT MANUALLY -->

- `label` (string) - Matching the label of an image by exact label

- `label_regex` (string) - Matching the label of an image by a regular expression

- `id` (string) - Matching the ID of an image by exact ID

- `id_regex` (string) - Matching the ID of an image by a regular expression

- `latest` (bool) - Whether to use the latest created image when there are multiple matches

<!-- End of code generated from the comments of the Config struct in datasource/image/data.go; -->

<!-- Code generated from the comments of the LinodeCommon struct in helper/common.go; DO NOT EDIT MANUALLY -->

- `linode_token` (string) - The Linode API token. This can also be specified in LINODE_TOKEN environment variable

<!-- End of code generated from the comments of the LinodeCommon struct in helper/common.go; -->


## Output:

<!-- Code generated from the comments of the DatasourceOutput struct in datasource/image/data.go; DO NOT EDIT MANUALLY -->

- `id` (string) - The unique ID of this Image.

- `capabilities` ([]string) - A list containing the following possible capabilities of this Image:
- cloud-init: This Image supports cloud-init with Metadata. Only applies to public Images.

- `created` (string) - When this Image was created.

- `created_by` (string) - The name of the User who created this Image, or “linode” for public Images.

- `deprecated` (bool) - Whether or not this Image is deprecated. Will only be true for deprecated public Images.

- `description` (string) - A detailed description of this Image.

- `eol` (string) - The date of the public Image’s planned end of life. `null` for private Images.

- `expiry` (string) - Expiry date of the image.
Only Images created automatically from a deleted Linode (type=automatic) will expire.

- `is_public` (bool) - True if the Image is a public distribution image.
False if Image is private Account-specific Image.

- `label` (string) - A short description of the Image.

- `size` (int) - The minimum size this Image needs to deploy. Size is in MB.

- `type` (string) - Enum: `manual` `automatic`
How the Image was created.
"Manual" Images can be created at any time.
"Automatic" Images are created automatically from a deleted Linode.

- `updated` (string) - When this Image was last updated.

- `vendor` (string) - The upstream distribution vendor. `null` for private Images.

<!-- End of code generated from the comments of the DatasourceOutput struct in datasource/image/data.go; -->
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ NAME=linode
BINARY=packer-plugin-${NAME}
PLUGIN_FQN="$(shell grep -E '^module' <go.mod | sed -E 's/module *//')"
COUNT?=1
UNIT_TEST_TARGET?=$(shell go list ./builder/...)
TEST?=$(shell go list ./...)
HASHICORP_PACKER_PLUGIN_SDK_VERSION?=$(shell go list -m github.com/hashicorp/packer-plugin-sdk | cut -d " " -f2)
PACKER_SDC_REPO ?= github.com/hashicorp/packer-plugin-sdk/cmd/packer-sdc
.DEFAULT_GOAL = dev
Expand All @@ -21,7 +21,7 @@ build: fmtcheck
@go build -o ${BINARY}

.PHONY: test
test: fmtcheck unit-test int-test
test: fmtcheck acctest

.PHONY: install-packer-sdc
install-packer-sdc: ## Install packer sofware development command
Expand All @@ -33,15 +33,15 @@ plugin-check: install-packer-sdc build

.PHONY: unit-test
unit-test: dev
@go test -count $(COUNT) -v $(UNIT_TEST_TARGET) -timeout=10m
@go test -race -count $(COUNT) -v $(TEST) -timeout=10m

# int-test is an alias of acctest
.PHONY: int-test
int-test: acctest

.PHONY: acctest
acctest: dev
@PACKER_ACC=1 go test -count $(COUNT) ./... -v -timeout=100m
@PACKER_ACC=1 go test -race -count $(COUNT) -v $(TEST) -timeout=100m

.PHONY: generate
generate: install-packer-sdc
Expand Down
34 changes: 10 additions & 24 deletions builder/linode/builder_acc_test.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package linode

import (
"os"
"testing"

"github.com/hashicorp/packer-plugin-sdk/acctest"
"github.com/linode/packer-plugin-linode/helper/acceptance"
)

func TestBuilderAcc_basic(t *testing.T) {
if skip := testAccPreCheck(t); skip == true {
if skip := acceptance.TestAccPreCheck(t); skip == true {
return
}
acctest.TestPlugin(t, &acctest.PluginTestCase{
Expand All @@ -18,29 +18,15 @@ func TestBuilderAcc_basic(t *testing.T) {
})
}

func testAccPreCheck(t *testing.T) bool {
if os.Getenv(acctest.TestEnvVar) == "" {
t.Skipf("Acceptance tests skipped unless env '%s' set",
acctest.TestEnvVar)
return true
}

if v := os.Getenv("LINODE_TOKEN"); v == "" {
t.Fatal("LINODE_TOKEN must be set for acceptance tests")
return true
}
return false
const testBuilderAccBasic = `
source "linode" "example" {
image = "linode/ubuntu22.04"
instance_type = "g6-nanode-1"
region = "us-mia"
ssh_username = "root"
}

const testBuilderAccBasic = `
{
"builders": [{
"type": "linode",
"region": "us-mia",
"instance_type": "g6-nanode-1",
"image": "linode/debian12",
"ssh_username": "root",
"cloud_init": true
}]
build {
sources = ["source.linode.example"]
}
`
Loading
Loading