-
Notifications
You must be signed in to change notification settings - Fork 7
/
artifact.go
96 lines (82 loc) · 2.21 KB
/
artifact.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package upcloud
import (
"fmt"
"log"
"strings"
"github.com/UpCloudLtd/packer-plugin-upcloud/internal/driver"
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud"
"github.com/hashicorp/packer-plugin-sdk/packer/registry/image"
)
// packersdk.Artifact implementation
type Artifact struct {
config *Config
driver driver.Driver
Templates []*upcloud.Storage
// StateData should store data such as GeneratedData
// to be shared with post-processors
StateData map[string]interface{}
}
func (*Artifact) BuilderId() string {
return BuilderId
}
func (a *Artifact) Files() []string {
return []string{}
}
func (a *Artifact) Id() string {
result := []string{}
for _, t := range a.Templates {
result = append(result, t.UUID)
}
return strings.Join(result, ",")
}
func (a *Artifact) String() string {
return fmt.Sprintf("Storage template created, UUID: %s", a.Id())
}
func (a *Artifact) State(name string) interface{} {
if name == image.ArtifactStateURI {
images, err := a.buildHCPPackerRegistryMetadata()
if err != nil {
log.Printf("[DEBUG] error encountered when creating a registry image %v", err)
return nil
}
return images
}
return a.StateData[name]
}
func (a *Artifact) Destroy() error {
for _, t := range a.Templates {
err := a.driver.DeleteTemplate(t.UUID)
if err != nil {
return err
}
}
return nil
}
func (a *Artifact) buildHCPPackerRegistryMetadata() ([]*image.Image, error) {
var sourceTemplateUUID, sourceTemplateTitle string
if v, ok := a.StateData["source_template_uuid"]; ok {
sourceTemplateUUID = v.(string)
}
if v, ok := a.StateData["source_template_title"]; ok {
sourceTemplateTitle = v.(string)
}
images := make([]*image.Image, 0)
for _, template := range a.Templates {
img, err := image.FromArtifact(a,
image.WithID(template.UUID),
image.WithRegion(template.Zone),
image.WithProvider("upcloud"),
)
if err != nil {
return images, err
}
img.SourceImageID = sourceTemplateUUID
img.Labels["source_id"] = sourceTemplateUUID
img.Labels["source"] = sourceTemplateTitle
img.Labels["name"] = template.Title
img.Labels["name_prefix"] = a.config.TemplatePrefix
img.Labels["size"] = fmt.Sprint(template.Size)
images = append(images, img)
}
return images, nil
}