/
softlayer_stemcell_service_create.go
112 lines (91 loc) · 3.39 KB
/
softlayer_stemcell_service_create.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package stemcell
import (
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
bosherr "github.com/cloudfoundry/bosh-utils/errors"
)
func (s SoftlayerStemcellService) CreateFromTarball(imagePath string, datacenter string, osCode string) (int, error) {
// Decompress tarball
defer func() {
errDefer := s.deleteLocalImageFile(imagePath)
if errDefer != nil {
s.logger.Error(softlayerStemcellServiceLogTag, "Delete local VHD file: %s", errDefer)
}
}()
imagePath, err := s.decompressTarBall(imagePath)
if err != nil {
return 0, bosherr.WrapErrorf(err, "Decompress image tarball")
}
s.logger.Debug(softlayerStemcellServiceLogTag, "Create a random SoftLayer image name with prefix '%s'", softlayerImageNamePrefix)
uuidStr, err := s.uuidGen.Generate()
if err != nil {
return 0, bosherr.WrapErrorf(err, "Generating random prefix")
}
// Create a temporary container as image name
imageName := fmt.Sprintf("%s-%s", softlayerImageNamePrefix, uuidStr)
defer func() {
errDefer := s.softlayerClient.DeleteSwiftContainer(imageName)
if errDefer != nil {
s.logger.Error(softlayerStemcellServiceLogTag, "Delete SoftLayer Swift container '%s': %s", imageName, errDefer.Error())
}
}()
err = s.softlayerClient.CreateSwiftContainer(imageName)
if err != nil {
return 0, bosherr.WrapErrorf(err, "Create SoftLayer Swift container '%s'", imageName)
}
// Upload the image object
imageFileName := imageName + ".vhd"
defer func() {
errDefer := s.softlayerClient.DeleteSwiftLargeObject(imageName, imageFileName)
if errDefer != nil {
s.logger.Error(softlayerStemcellServiceLogTag, "Delete SoftLayer Swift large object with '%s/%s': %s", imageName, imageFileName, errDefer.Error())
}
}()
err = s.softlayerClient.UploadSwiftLargeObject(imageName, imageFileName, imagePath)
if err != nil {
return 0, bosherr.WrapErrorf(err, "Create SoftLayer Swift large object with '%s/%s'", imageName, imageFileName)
}
// Import
stemcellId, err := s.softlayerClient.CreateImageFromExternalSource(imageName, "Imported by SL CPI", datacenter, osCode)
if err != nil {
return 0, bosherr.WrapErrorf(err, "Create image from Swift object storage")
}
return stemcellId, nil
}
func (s SoftlayerStemcellService) decompressTarBall(source string) (string, error) {
source = filepath.Clean(source)
s.logger.Debug(softlayerStemcellServiceLogTag, "Decompress the file '%s'", source)
reader, err := os.Open(filepath.Clean(source))
if err != nil {
return "", bosherr.WrapErrorf(err, "Open tarball file")
}
defer reader.Close() // #nosec G307
archive, err := gzip.NewReader(reader)
if err != nil {
return "", bosherr.WrapErrorf(err, "Create new archive Reader")
}
defer archive.Close()
targetFile := filepath.Join(source + ".vhd")
s.logger.Debug(softlayerStemcellServiceLogTag, "Create image file '%s'", targetFile)
writer, err := os.Create(targetFile)
if err != nil {
return "", bosherr.WrapErrorf(err, "Create image file")
}
defer writer.Close() // // #nosec G307
_, err = io.Copy(writer, archive) // #nosec G110
if err != nil {
return "", bosherr.WrapErrorf(err, "Copy decompressed image data")
}
return targetFile, nil
}
func (s SoftlayerStemcellService) deleteLocalImageFile(filePath string) error {
s.logger.Debug(softlayerStemcellServiceLogTag, "Delete local image file '%s'", filePath)
err := os.Remove(filePath)
if err != nil {
return bosherr.WrapErrorf(err, "Delete image file '%s'", filePath)
}
return nil
}