github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/builder/azure/arm/artifact.go (about) 1 // Copyright (c) Microsoft Corporation. All rights reserved. 2 // Licensed under the MIT License. See the LICENSE file in builder/azure for license information. 3 4 package arm 5 6 import ( 7 "bytes" 8 "fmt" 9 "net/url" 10 "path" 11 "strings" 12 ) 13 14 const ( 15 BuilderId = "Azure.ResourceManagement.VMImage" 16 ) 17 18 type Artifact struct { 19 StorageAccountLocation string 20 OSDiskUri string 21 TemplateUri string 22 OSDiskUriReadOnlySas string 23 TemplateUriReadOnlySas string 24 } 25 26 func NewArtifact(template *CaptureTemplate, getSasUrl func(name string) string) (*Artifact, error) { 27 if template == nil { 28 return nil, fmt.Errorf("nil capture template") 29 } 30 31 if len(template.Resources) != 1 { 32 return nil, fmt.Errorf("malformed capture template, expected one resource") 33 } 34 35 vhdUri, err := url.Parse(template.Resources[0].Properties.StorageProfile.OSDisk.Image.Uri) 36 if err != nil { 37 return nil, err 38 } 39 40 templateUri, err := storageUriToTemplateUri(vhdUri) 41 if err != nil { 42 return nil, err 43 } 44 45 return &Artifact{ 46 OSDiskUri: vhdUri.String(), 47 OSDiskUriReadOnlySas: getSasUrl(getStorageUrlPath(vhdUri)), 48 TemplateUri: templateUri.String(), 49 TemplateUriReadOnlySas: getSasUrl(getStorageUrlPath(templateUri)), 50 51 StorageAccountLocation: template.Resources[0].Location, 52 }, nil 53 } 54 55 func getStorageUrlPath(u *url.URL) string { 56 parts := strings.Split(u.Path, "/") 57 return strings.Join(parts[3:], "/") 58 } 59 60 func storageUriToTemplateUri(su *url.URL) (*url.URL, error) { 61 // packer-osDisk.4085bb15-3644-4641-b9cd-f575918640b4.vhd -> 4085bb15-3644-4641-b9cd-f575918640b4 62 filename := path.Base(su.Path) 63 parts := strings.Split(filename, ".") 64 65 if len(parts) < 3 { 66 return nil, fmt.Errorf("malformed URL") 67 } 68 69 // packer-osDisk.4085bb15-3644-4641-b9cd-f575918640b4.vhd -> packer 70 prefixParts := strings.Split(parts[0], "-") 71 prefix := strings.Join(prefixParts[:len(prefixParts)-1], "-") 72 73 templateFilename := fmt.Sprintf("%s-vmTemplate.%s.json", prefix, parts[1]) 74 75 // https://storage.blob.core.windows.net/system/Microsoft.Compute/Images/images/packer-osDisk.4085bb15-3644-4641-b9cd-f575918640b4.vhd" 76 // -> 77 // https://storage.blob.core.windows.net/system/Microsoft.Compute/Images/images/packer-vmTemplate.4085bb15-3644-4641-b9cd-f575918640b4.json" 78 return url.Parse(strings.Replace(su.String(), filename, templateFilename, 1)) 79 } 80 81 func (*Artifact) BuilderId() string { 82 return BuilderId 83 } 84 85 func (*Artifact) Files() []string { 86 return []string{} 87 } 88 89 func (*Artifact) Id() string { 90 return "" 91 } 92 93 func (*Artifact) State(name string) interface{} { 94 return nil 95 } 96 97 func (a *Artifact) String() string { 98 var buf bytes.Buffer 99 100 buf.WriteString(fmt.Sprintf("%s:\n\n", a.BuilderId())) 101 buf.WriteString(fmt.Sprintf("StorageAccountLocation: %s\n", a.StorageAccountLocation)) 102 buf.WriteString(fmt.Sprintf("OSDiskUri: %s\n", a.OSDiskUri)) 103 buf.WriteString(fmt.Sprintf("OSDiskUriReadOnlySas: %s\n", a.OSDiskUriReadOnlySas)) 104 buf.WriteString(fmt.Sprintf("TemplateUri: %s\n", a.TemplateUri)) 105 buf.WriteString(fmt.Sprintf("TemplateUriReadOnlySas: %s\n", a.TemplateUriReadOnlySas)) 106 107 return buf.String() 108 } 109 110 func (*Artifact) Destroy() error { 111 return nil 112 }