Support piping of yandex-import post-processors
This commit is contained in:
parent
b28be46dc1
commit
b16cccde3d
|
@ -0,0 +1,36 @@
|
||||||
|
package yandeximport
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const BuilderId = "packer.post-processor.yandex-import"
|
||||||
|
|
||||||
|
type Artifact struct {
|
||||||
|
imageID string
|
||||||
|
sourceURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Artifact) BuilderId() string {
|
||||||
|
return BuilderId
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Artifact) Id() string {
|
||||||
|
return a.sourceURL
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Artifact) Files() []string {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Artifact) String() string {
|
||||||
|
return fmt.Sprintf("Create image %v from URL %v", a.imageID, a.sourceURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Artifact) State(name string) interface{} {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Artifact) Destroy() error {
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -172,6 +172,7 @@ func (p *PostProcessor) PostProcess(ctx context.Context, ui packer.Ui, artifact
|
||||||
}
|
}
|
||||||
|
|
||||||
var url string
|
var url string
|
||||||
|
var fileSource bool
|
||||||
|
|
||||||
// Create temporary storage Access Key
|
// Create temporary storage Access Key
|
||||||
respWithKey, err := client.SDK().IAM().AWSCompatibility().AccessKey().Create(ctx, &awscompatibility.CreateAccessKeyRequest{
|
respWithKey, err := client.SDK().IAM().AWSCompatibility().AccessKey().Create(ctx, &awscompatibility.CreateAccessKeyRequest{
|
||||||
|
@ -190,6 +191,7 @@ func (p *PostProcessor) PostProcess(ctx context.Context, ui packer.Ui, artifact
|
||||||
switch artifact.BuilderId() {
|
switch artifact.BuilderId() {
|
||||||
case compress.BuilderId, artifice.BuilderId, file.BuilderId:
|
case compress.BuilderId, artifice.BuilderId, file.BuilderId:
|
||||||
// Artifact as a file, need to be uploaded to storage before create Compute Image
|
// Artifact as a file, need to be uploaded to storage before create Compute Image
|
||||||
|
fileSource = true
|
||||||
|
|
||||||
// As `bucket` option validate input here
|
// As `bucket` option validate input here
|
||||||
if p.config.Bucket == "" {
|
if p.config.Bucket == "" {
|
||||||
|
@ -205,9 +207,13 @@ func (p *PostProcessor) PostProcess(ctx context.Context, ui packer.Ui, artifact
|
||||||
// Artifact already in storage, just get URL
|
// Artifact already in storage, just get URL
|
||||||
url = artifact.Id()
|
url = artifact.Id()
|
||||||
|
|
||||||
|
case BuilderId:
|
||||||
|
// Artifact from prev yandex-import PP, reuse URL
|
||||||
|
url = artifact.Id()
|
||||||
|
|
||||||
default:
|
default:
|
||||||
err := fmt.Errorf(
|
err := fmt.Errorf(
|
||||||
"Unknown artifact type: %s\nCan only import from Yandex-Export, Compress, Artifice and File post-processor artifacts.",
|
"Unknown artifact type: %s\nCan only import from Yandex-Export, Yandex-Import, Compress, Artifice and File post-processor artifacts.",
|
||||||
artifact.BuilderId())
|
artifact.BuilderId())
|
||||||
return nil, false, false, err
|
return nil, false, false, err
|
||||||
}
|
}
|
||||||
|
@ -222,7 +228,7 @@ func (p *PostProcessor) PostProcess(ctx context.Context, ui packer.Ui, artifact
|
||||||
return nil, false, false, err
|
return nil, false, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !p.config.SkipClean {
|
if fileSource && !p.config.SkipClean {
|
||||||
err = deleteFromBucket(storageClient, ui, url)
|
err = deleteFromBucket(storageClient, ui, url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, false, err
|
return nil, false, false, err
|
||||||
|
@ -237,7 +243,10 @@ func (p *PostProcessor) PostProcess(ctx context.Context, ui packer.Ui, artifact
|
||||||
return nil, false, false, fmt.Errorf("error delete static access key: %s", err)
|
return nil, false, false, fmt.Errorf("error delete static access key: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ycImage, false, false, nil
|
return &Artifact{
|
||||||
|
imageID: ycImage.GetId(),
|
||||||
|
sourceURL: url,
|
||||||
|
}, false, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func uploadToBucket(s3conn *s3.S3, ui packer.Ui, artifact packer.Artifact, bucket string, objectName string) (string, error) {
|
func uploadToBucket(s3conn *s3.S3, ui packer.Ui, artifact packer.Artifact, bucket string, objectName string) (string, error) {
|
||||||
|
@ -285,7 +294,7 @@ func uploadToBucket(s3conn *s3.S3, ui packer.Ui, artifact packer.Artifact, bucke
|
||||||
return req.HTTPRequest.URL.String(), nil
|
return req.HTTPRequest.URL.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createYCImage(ctx context.Context, driver yandex.Driver, ui packer.Ui, folderID string, rawImageURL string, imageName string, imageDescription string, imageFamily string, imageLabels map[string]string) (packer.Artifact, error) {
|
func createYCImage(ctx context.Context, driver yandex.Driver, ui packer.Ui, folderID string, rawImageURL string, imageName string, imageDescription string, imageFamily string, imageLabels map[string]string) (*compute.Image, error) {
|
||||||
op, err := driver.SDK().WrapOperation(driver.SDK().Compute().Image().Create(ctx, &compute.CreateImageRequest{
|
op, err := driver.SDK().WrapOperation(driver.SDK().Compute().Image().Create(ctx, &compute.CreateImageRequest{
|
||||||
FolderId: folderID,
|
FolderId: folderID,
|
||||||
Name: imageName,
|
Name: imageName,
|
||||||
|
@ -328,9 +337,8 @@ func createYCImage(ctx context.Context, driver yandex.Driver, ui packer.Ui, fold
|
||||||
return nil, fmt.Errorf("error while image get request: %s", err)
|
return nil, fmt.Errorf("error while image get request: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &yandex.Artifact{
|
return image, nil
|
||||||
Image: image,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteFromBucket(s3conn *s3.S3, ui packer.Ui, url string) error {
|
func deleteFromBucket(s3conn *s3.S3, ui packer.Ui, url string) error {
|
||||||
|
|
Loading…
Reference in New Issue