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  }