github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/builder/azure/arm/template_factory.go (about)

     1  package arm
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	"github.com/Azure/azure-sdk-for-go/arm/compute"
     7  	"github.com/Azure/azure-sdk-for-go/arm/resources/resources"
     8  
     9  	"github.com/mitchellh/packer/builder/azure/common/constants"
    10  	"github.com/mitchellh/packer/builder/azure/common/template"
    11  )
    12  
    13  type templateFactoryFunc func(*Config) (*resources.Deployment, error)
    14  
    15  func GetKeyVaultDeployment(config *Config) (*resources.Deployment, error) {
    16  	params := &template.TemplateParameters{
    17  		KeyVaultName:        &template.TemplateParameter{Value: config.tmpKeyVaultName},
    18  		KeyVaultSecretValue: &template.TemplateParameter{Value: config.winrmCertificate},
    19  		ObjectId:            &template.TemplateParameter{Value: config.ObjectID},
    20  		TenantId:            &template.TemplateParameter{Value: config.TenantID},
    21  	}
    22  
    23  	builder, _ := template.NewTemplateBuilder(template.KeyVault)
    24  	builder.SetTags(&config.AzureTags)
    25  
    26  	doc, _ := builder.ToJSON()
    27  	return createDeploymentParameters(*doc, params)
    28  }
    29  
    30  func GetVirtualMachineDeployment(config *Config) (*resources.Deployment, error) {
    31  	params := &template.TemplateParameters{
    32  		AdminUsername:              &template.TemplateParameter{Value: config.UserName},
    33  		AdminPassword:              &template.TemplateParameter{Value: config.Password},
    34  		DnsNameForPublicIP:         &template.TemplateParameter{Value: config.tmpComputeName},
    35  		OSDiskName:                 &template.TemplateParameter{Value: config.tmpOSDiskName},
    36  		StorageAccountBlobEndpoint: &template.TemplateParameter{Value: config.storageAccountBlobEndpoint},
    37  		VMSize: &template.TemplateParameter{Value: config.VMSize},
    38  		VMName: &template.TemplateParameter{Value: config.tmpComputeName},
    39  	}
    40  
    41  	builder, _ := template.NewTemplateBuilder(template.BasicTemplate)
    42  	osType := compute.Linux
    43  
    44  	switch config.OSType {
    45  	case constants.Target_Linux:
    46  		builder.BuildLinux(config.sshAuthorizedKey)
    47  	case constants.Target_Windows:
    48  		osType = compute.Windows
    49  		builder.BuildWindows(config.tmpKeyVaultName, config.tmpWinRMCertificateUrl)
    50  	}
    51  
    52  	if config.ImageUrl != "" {
    53  		builder.SetImageUrl(config.ImageUrl, osType)
    54  	} else {
    55  		builder.SetMarketPlaceImage(config.ImagePublisher, config.ImageOffer, config.ImageSku, config.ImageVersion)
    56  	}
    57  
    58  	if config.OSDiskSizeGB > 0 {
    59  		builder.SetOSDiskSizeGB(config.OSDiskSizeGB)
    60  	}
    61  
    62  	if config.customData != "" {
    63  		builder.SetCustomData(config.customData)
    64  	}
    65  
    66  	if config.VirtualNetworkName != "" {
    67  		builder.SetVirtualNetwork(
    68  			config.VirtualNetworkResourceGroupName,
    69  			config.VirtualNetworkName,
    70  			config.VirtualNetworkSubnetName)
    71  	}
    72  
    73  	builder.SetTags(&config.AzureTags)
    74  	doc, _ := builder.ToJSON()
    75  	return createDeploymentParameters(*doc, params)
    76  }
    77  
    78  func createDeploymentParameters(doc string, parameters *template.TemplateParameters) (*resources.Deployment, error) {
    79  	var template map[string]interface{}
    80  	err := json.Unmarshal(([]byte)(doc), &template)
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  
    85  	bs, err := json.Marshal(*parameters)
    86  	if err != nil {
    87  		return nil, err
    88  	}
    89  
    90  	var templateParameters map[string]interface{}
    91  	err = json.Unmarshal(bs, &templateParameters)
    92  	if err != nil {
    93  		return nil, err
    94  	}
    95  
    96  	return &resources.Deployment{
    97  		Properties: &resources.DeploymentProperties{
    98  			Mode:       resources.Incremental,
    99  			Template:   &template,
   100  			Parameters: &templateParameters,
   101  		},
   102  	}, nil
   103  }